mirror of
https://github.com/neovim/neovim.git
synced 2025-09-05 19:08:15 +00:00
refactor(channel): eliminate special case in on_proc_exit() #32485
Problem: on_proc_exit() has a special-case that assumes that the UI client will never spawn more than 1 child process. Solution: If the Nvim server exits, the stream EOF will trigger `rpc_close()` in the UI client, so we don't need the special case in `on_proc_exit`. Pass `Channel.exit_status` from `rpc_close()` so that the correct exit code is reflected.
This commit is contained in:
@@ -40,7 +40,7 @@ struct Channel {
|
||||
CallbackReader on_data;
|
||||
CallbackReader on_stderr;
|
||||
Callback on_exit;
|
||||
int exit_status;
|
||||
int exit_status; ///< Process exit-code (if the channel wraps a process).
|
||||
|
||||
bool callback_busy;
|
||||
bool callback_scheduled;
|
||||
|
@@ -437,11 +437,6 @@ static void on_proc_exit(Proc *proc)
|
||||
Loop *loop = proc->loop;
|
||||
ILOG("child exited: pid=%d status=%d" PRIu64, proc->pid, proc->status);
|
||||
|
||||
// XXX: This assumes the TUI never spawns any other processes...?
|
||||
if (ui_client_channel_id) {
|
||||
exit_on_closed_chan(proc->status);
|
||||
}
|
||||
|
||||
// Process has terminated, but there could still be data to be read from the
|
||||
// OS. We are still in the libuv loop, so we cannot call code that polls for
|
||||
// more data directly. Instead delay the reading after the libuv loop by
|
||||
|
@@ -486,15 +486,15 @@ void rpc_close(Channel *channel)
|
||||
channel->rpc.closed = true;
|
||||
channel_decref(channel);
|
||||
|
||||
if (ui_client_channel_id && channel->id == ui_client_channel_id) {
|
||||
assert(!channel->detach); // `Channel.detach` is not currently used by the UI client.
|
||||
exit_on_closed_chan(0);
|
||||
} else if (channel->streamtype == kChannelStreamStdio) {
|
||||
// Avoid hanging when there are no other UIs and a prompt is triggered on exit.
|
||||
remote_ui_disconnect(channel->id);
|
||||
bool is_ui_client = ui_client_channel_id && channel->id == ui_client_channel_id;
|
||||
if (is_ui_client || channel->streamtype == kChannelStreamStdio) {
|
||||
if (!is_ui_client) {
|
||||
// Avoid hanging when there are no other UIs and a prompt is triggered on exit.
|
||||
remote_ui_disconnect(channel->id);
|
||||
}
|
||||
|
||||
if (!channel->detach) {
|
||||
exit_on_closed_chan(0);
|
||||
exit_on_closed_chan(channel->exit_status == -1 ? 0 : channel->exit_status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user