diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-03-13 05:44:50 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-13 05:44:50 +0800 |
commit | 356631cba0e8dc413202f4bc874cb7f204056bae (patch) | |
tree | 0570182b73a82a97a04a2d61aa439506c75c4454 /src | |
parent | 36ca585d2f6b048c518edb9a3003cb7f0ec826ab (diff) | |
parent | f1c9065b0ecfcb8893aaffb00f77ec75e8d2b0d9 (diff) | |
download | rneovim-356631cba0e8dc413202f4bc874cb7f204056bae.tar.gz rneovim-356631cba0e8dc413202f4bc874cb7f204056bae.tar.bz2 rneovim-356631cba0e8dc413202f4bc874cb7f204056bae.zip |
Merge pull request #17687 from zeertzjq/fix-channel-consistency
fix(channel): fix channel consistency
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/vim.c | 1 | ||||
-rw-r--r-- | src/nvim/channel.c | 16 | ||||
-rw-r--r-- | src/nvim/channel.h | 1 | ||||
-rw-r--r-- | src/nvim/terminal.c | 8 |
4 files changed, 21 insertions, 5 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index a942c94f46..b8c66a034c 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -1140,6 +1140,7 @@ Integer nvim_open_term(Buffer buffer, DictionaryOf(LuaRef) opts, Error *err) TerminalOptions topts; Channel *chan = channel_alloc(kChannelStreamInternal); chan->stream.internal.cb = cb; + chan->stream.internal.closed = false; topts.data = chan; // NB: overridden in terminal_check_size if a window is already // displaying the buffer diff --git a/src/nvim/channel.c b/src/nvim/channel.c index d79c0acc4a..f87b3a2f8f 100644 --- a/src/nvim/channel.c +++ b/src/nvim/channel.c @@ -138,8 +138,14 @@ bool channel_close(uint64_t id, ChannelPart part, const char **error) *error = (const char *)e_invstream; return false; } - api_free_luaref(chan->stream.internal.cb); - chan->stream.internal.cb = LUA_NOREF; + if (chan->term) { + api_free_luaref(chan->stream.internal.cb); + chan->stream.internal.cb = LUA_NOREF; + chan->stream.internal.closed = true; + terminal_close(chan->term, 0); + } else { + channel_decref(chan); + } break; default: @@ -536,7 +542,11 @@ size_t channel_send(uint64_t id, char *data, size_t len, bool data_owned, const } if (chan->streamtype == kChannelStreamInternal) { - if (!chan->term) { + if (chan->is_rpc) { + *error = _("Can't send raw data to rpc channel"); + goto retfree; + } + if (!chan->term || chan->stream.internal.closed) { *error = _("Can't send data to closed stream"); goto retfree; } diff --git a/src/nvim/channel.h b/src/nvim/channel.h index 50d6b3600a..5cec5731eb 100644 --- a/src/nvim/channel.h +++ b/src/nvim/channel.h @@ -44,6 +44,7 @@ typedef struct { typedef struct { LuaRef cb; + bool closed; } InternalState; typedef struct { diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 1c26e46a21..a76a806b80 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -317,10 +317,14 @@ void terminal_close(Terminal *term, int status) term->opts.close_cb(term->opts.data); } } else if (!only_destroy) { - // This was called by channel_process_exit_cb() not in process_teardown(). + // Associated channel has been closed and the editor is not exiting. // Do not call the close callback now. Wait for the user to press a key. char msg[sizeof("\r\n[Process exited ]") + NUMBUFLEN]; - snprintf(msg, sizeof msg, "\r\n[Process exited %d]", status); + if (((Channel *)term->opts.data)->streamtype == kChannelStreamInternal) { + snprintf(msg, sizeof msg, "\r\n[Terminal closed]"); + } else { + snprintf(msg, sizeof msg, "\r\n[Process exited %d]", status); + } terminal_receive(term, msg, strlen(msg)); } |