From b360c0608556232c8ddb7ecc9cd26e68584bee76 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Mon, 17 Feb 2025 02:26:19 -0800 Subject: 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. --- src/nvim/msgpack_rpc/channel.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/nvim/msgpack_rpc') diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index fa50afd83b..1d24198455 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -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); } } } -- cgit