diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/channel.c | 23 | ||||
| -rw-r--r-- | src/nvim/globals.h | 3 | 
2 files changed, 22 insertions, 4 deletions
| diff --git a/src/nvim/channel.c b/src/nvim/channel.c index ff8dbd3d33..efef95de01 100644 --- a/src/nvim/channel.c +++ b/src/nvim/channel.c @@ -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; diff --git a/src/nvim/globals.h b/src/nvim/globals.h index dd216f177f..3df201b6bf 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -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")); | 
