diff options
author | oni-link <knil.ino@gmail.com> | 2016-05-20 21:19:10 +0200 |
---|---|---|
committer | oni-link <knil.ino@gmail.com> | 2016-05-28 11:25:13 +0200 |
commit | 677eae6b0f84ebbc165a73aee65262d71af312cc (patch) | |
tree | b5aaaee0fe4ca7ac4eb8b46582001057bf946d61 | |
parent | 48e945e588c1f32b0ae358d674f033328e2696c6 (diff) | |
download | rneovim-677eae6b0f84ebbc165a73aee65262d71af312cc.tar.gz rneovim-677eae6b0f84ebbc165a73aee65262d71af312cc.tar.bz2 rneovim-677eae6b0f84ebbc165a73aee65262d71af312cc.zip |
process.c: Fix a block when in teardown mode
nvim blocking can be tested with "nvim +te +'!xclip' +qa"
By closing all handles for a pty process, we unblock the event loop if
the process has not terminated yet.
-rw-r--r-- | src/nvim/event/process.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c index 9bb62891c7..554a592d5c 100644 --- a/src/nvim/event/process.c +++ b/src/nvim/event/process.c @@ -116,18 +116,13 @@ void process_teardown(Loop *loop) FUNC_ATTR_NONNULL_ALL process_is_tearing_down = true; kl_iter(WatcherPtr, loop->children, current) { Process *proc = (*current)->data; - if (proc->detach) { + if (proc->detach || proc->type == kProcessTypePty) { // Close handles to process without killing it. CREATE_EVENT(loop->events, process_close_handles, 1, proc); } else { - if (proc->type == kProcessTypeUv) { - uv_kill(proc->pid, SIGTERM); - proc->term_sent = true; - process_stop(proc); - } else { // kProcessTypePty - process_close_streams(proc); - pty_process_close_master((PtyProcess *)proc); - } + uv_kill(proc->pid, SIGTERM); + proc->term_sent = true; + process_stop(proc); } } @@ -315,8 +310,10 @@ static void decref(Process *proc) static void process_close(Process *proc) FUNC_ATTR_NONNULL_ARG(1) { - if (process_is_tearing_down && proc->detach && proc->closed) { - // If a detached process dies while tearing down it might get closed twice. + if (process_is_tearing_down && (proc->detach || proc->type == kProcessTypePty) + && proc->closed) { + // If a detached/pty process dies while tearing down it might get closed + // twice. return; } assert(!proc->closed); |