mirror of
https://github.com/neovim/neovim.git
synced 2025-09-30 23:18:33 +00:00
channel: check for existance before trying to set key
This avoids an error message in async context, where it is not safe.
This commit is contained in:
@@ -599,6 +599,7 @@ static void on_stdio_input(Stream *stream, RBuffer *buf, size_t count,
|
||||
on_channel_output(stream, chan, buf, count, eof, &chan->on_stdout, "stdin");
|
||||
}
|
||||
|
||||
/// @param type must have static lifetime
|
||||
static void on_channel_output(Stream *stream, Channel *chan, RBuffer *buf,
|
||||
size_t count, bool eof, CallbackReader *reader,
|
||||
const char *type)
|
||||
@@ -613,14 +614,20 @@ static void on_channel_output(Stream *stream, Channel *chan, RBuffer *buf,
|
||||
if (reader->cb.type != kCallbackNone) {
|
||||
process_channel_event(chan, &reader->cb, type, reader->buffer.ga_data,
|
||||
(size_t)reader->buffer.ga_len, 0);
|
||||
ga_clear(&reader->buffer);
|
||||
} else if (reader->self) {
|
||||
list_T *data = buffer_to_tv_list(reader->buffer.ga_data,
|
||||
(size_t)reader->buffer.ga_len);
|
||||
tv_dict_add_list(reader->self, type, strlen(type), data);
|
||||
if (tv_dict_find(reader->self, type, -1) == NULL) {
|
||||
list_T *data = buffer_to_tv_list(reader->buffer.ga_data,
|
||||
(size_t)reader->buffer.ga_len);
|
||||
tv_dict_add_list(reader->self, type, strlen(type), data);
|
||||
} else {
|
||||
// can't display error message now, defer it.
|
||||
channel_incref(chan);
|
||||
multiqueue_put(chan->events, on_buffered_error, 2, chan, type);
|
||||
}
|
||||
} else {
|
||||
abort();
|
||||
}
|
||||
ga_clear(&reader->buffer);
|
||||
} else if (reader->cb.type != kCallbackNone) {
|
||||
process_channel_event(chan, &reader->cb, type, ptr, 0, 0);
|
||||
}
|
||||
@@ -641,6 +648,14 @@ static void on_channel_output(Stream *stream, Channel *chan, RBuffer *buf,
|
||||
}
|
||||
}
|
||||
|
||||
static void on_buffered_error(void **args)
|
||||
{
|
||||
Channel *chan = (Channel *)args[0];
|
||||
const char *stream = (const char *)args[1];
|
||||
EMSG3(_(e_streamkey), stream, chan->id);
|
||||
channel_decref(chan);
|
||||
}
|
||||
|
||||
static void channel_process_exit_cb(Process *proc, int status, void *data)
|
||||
{
|
||||
Channel *chan = data;
|
||||
|
@@ -1063,6 +1063,9 @@ EXTERN char_u e_stdiochan2[] INIT(= N_(
|
||||
EXTERN char_u e_invstream[] INIT(= N_("E906: invalid stream for channel"));
|
||||
EXTERN char_u e_invstreamrpc[] INIT(= N_(
|
||||
"E906: invalid stream for rpc channel, use 'rpc'"));
|
||||
EXTERN char_u e_streamkey[] INIT(= N_(
|
||||
"E5210: dict key '%s' already set for buffered stream in channel %"
|
||||
PRIu64));
|
||||
EXTERN char_u e_libcall[] INIT(= N_("E364: Library call failed for \"%s()\""));
|
||||
EXTERN char_u e_mkdir[] INIT(= N_("E739: Cannot create directory %s: %s"));
|
||||
EXTERN char_u e_markinval[] INIT(= N_("E19: Mark has invalid line number"));
|
||||
|
Reference in New Issue
Block a user