channels: reimplement logging (as stub for proper event)

This commit is contained in:
Björn Linse 2017-07-23 19:23:02 +02:00
parent 5af4703177
commit 5517d2323b
2 changed files with 73 additions and 5 deletions

View File

@ -178,6 +178,62 @@ static Channel *channel_alloc(ChannelStreamType type)
return chan;
}
/// Not implemented, only logging for now
void channel_create_event(Channel *chan, char *ext_source)
{
#if MIN_LOG_LEVEL <= INFO_LOG_LEVEL
char *stream_desc, *mode_desc, *source;
switch (chan->streamtype) {
case kChannelStreamProc:
if (chan->stream.proc.type == kProcessTypePty) {
stream_desc = "pty job";
} else {
stream_desc = "job";
}
break;
case kChannelStreamStdio:
stream_desc = "stdio";
break;
case kChannelStreamSocket:
stream_desc = "socket";
break;
case kChannelStreamInternal:
stream_desc = "socket (internal)";
break;
default:
stream_desc = "?";
}
if (chan->is_rpc) {
mode_desc = ", rpc";
} else if (chan->term) {
mode_desc = ", terminal";
} else {
mode_desc = "";
}
if (ext_source) {
// TODO(bfredl): in a future improved traceback solution,
// external events should be included.
source = ext_source;
} else {
eval_format_source_name_line((char *)IObuff, sizeof(IObuff));
source = (char *)IObuff;
}
ILOG("new channel %" PRIu64 " (%s%s): %s", chan->id, stream_desc,
mode_desc, source);
#else
(void)chan;
(void)ext_source;
#endif
}
void channel_incref(Channel *channel)
{
channel->refcount++;
@ -329,6 +385,7 @@ Channel *channel_job_start(char **argv, CallbackReader on_stdout,
rstream_init(&proc->err, 0);
rstream_start(&proc->err, on_job_stderr, chan);
}
*status_out = (varnumber_T)chan->id;
return chan;
}
@ -369,6 +426,7 @@ uint64_t channel_connect(bool tcp, const char *address,
rstream_start(&channel->stream.socket, on_socket_output, channel);
}
channel_create_event(channel, NULL);
return channel->id;
}
@ -384,6 +442,7 @@ void channel_from_connection(SocketWatcher *watcher)
wstream_init(&channel->stream.socket, 0);
rstream_init(&channel->stream.socket, 0);
rpc_start(channel);
channel_create_event(channel, watcher->addr);
}
/// Creates a loopback channel. This is used to avoid deadlock

View File

@ -11643,8 +11643,12 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
term_name = tv_dict_get_string(job_opts, "TERM", true);
}
channel_job_start(argv, on_stdout, on_stderr, on_exit, pty, rpc, detach,
cwd, width, height, term_name, &rettv->vval.v_number);
Channel *chan = channel_job_start(argv, on_stdout, on_stderr, on_exit, pty,
rpc, detach, cwd, width, height, term_name,
&rettv->vval.v_number);
if (chan) {
channel_create_event(chan, NULL);
}
}
// "jobstop()" function
@ -13872,9 +13876,13 @@ static void f_rpcstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
// The last item of argv must be NULL
argv[i] = NULL;
channel_job_start(argv, CALLBACK_READER_INIT, CALLBACK_READER_INIT,
CALLBACK_NONE, false, true, false, NULL, 0, 0, NULL,
&rettv->vval.v_number);
Channel *chan = channel_job_start(argv, CALLBACK_READER_INIT,
CALLBACK_READER_INIT, CALLBACK_NONE,
false, true, false, NULL, 0, 0, NULL,
&rettv->vval.v_number);
if (chan) {
channel_create_event(chan, NULL);
}
}
// "rpcstop()" function
@ -16672,6 +16680,7 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
api_clear_error(&err);
channel_terminal_open(chan);
channel_create_event(chan, NULL);
}
// "test_garbagecollect_now()" function