aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-07-16 03:36:12 -0400
committerJustin M. Keyes <justinkz@gmail.com>2016-07-16 03:36:12 -0400
commit7fa1baf44e7877b7b6b861c7140b006d4cee79f3 (patch)
tree88ab580a9ea3600c3703314c868aa6c4cf99e171 /src
parentff93c9bd9075b1369d4dcc8555d8c5444e3ff0f7 (diff)
parent1e593436d083f94d1e56f130ee498a9ff69736d7 (diff)
downloadrneovim-7fa1baf44e7877b7b6b861c7140b006d4cee79f3.tar.gz
rneovim-7fa1baf44e7877b7b6b861c7140b006d4cee79f3.tar.bz2
rneovim-7fa1baf44e7877b7b6b861c7140b006d4cee79f3.zip
Merge #4798 'process.c: Fix block in teardown'
Diffstat (limited to 'src')
-rw-r--r--src/nvim/event/process.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c
index 1c4c9737c3..317e40e43a 100644
--- a/src/nvim/event/process.c
+++ b/src/nvim/event/process.c
@@ -116,23 +116,20 @@ 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);
}
}
- // Wait until all children exit
- LOOP_PROCESS_EVENTS_UNTIL(loop, loop->events, -1, kl_empty(loop->children));
+ // Wait until all children exit and all close events are processed.
+ LOOP_PROCESS_EVENTS_UNTIL(
+ loop, loop->events, -1,
+ kl_empty(loop->children) && queue_empty(loop->events));
pty_process_teardown(loop);
}
@@ -315,8 +312,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);