aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroni-link <knil.ino@gmail.com>2016-05-20 21:19:10 +0200
committeroni-link <knil.ino@gmail.com>2016-05-28 11:25:13 +0200
commit677eae6b0f84ebbc165a73aee65262d71af312cc (patch)
treeb5aaaee0fe4ca7ac4eb8b46582001057bf946d61
parent48e945e588c1f32b0ae358d674f033328e2696c6 (diff)
downloadrneovim-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.c19
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);