From d32780de4daff2351d7c2605ea6ba318f88fac2f Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Mon, 24 Mar 2025 18:24:07 +0100 Subject: fix(mswin): UI may hang on exit Problem: On Windows, since b360c0608556, UI may hang on exit. #33019 Solution: Restore the hack in on_proc_exit, until we can figure out why rpc_close is not called in the UI client when the server closes the channel. --- src/nvim/event/proc.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/nvim/event/proc.c b/src/nvim/event/proc.c index 1a5e01eb9d..e02f9eb6cd 100644 --- a/src/nvim/event/proc.c +++ b/src/nvim/event/proc.c @@ -437,6 +437,17 @@ static void on_proc_exit(Proc *proc) Loop *loop = proc->loop; ILOG("child exited: pid=%d status=%d" PRIu64, proc->pid, proc->status); +#ifdef MSWIN + // XXX: This assumes the TUI never spawns any other processes...? + // TODO(justinmk): figure out why rpc_close sometimes(??) isn't called, then remove this jank. + // Theories: + // - EOF not received in receive_msgpack, then doesn't call chan_close_on_err(). + // - proc_close_handles not tickled by ui_client.c's LOOP_PROCESS_EVENTS? + if (ui_client_channel_id) { + exit_on_closed_chan(proc->status); + } +#endif + // 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 -- cgit