aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-03-25 08:52:40 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-03-25 18:57:35 -0300
commit710002c820e5a55e3b234074fefb84ab745e11a3 (patch)
tree425b494b0513dfad92cec50a1f4acf61c8cf6449
parent727f5241679c4c0da65810204a33e248739aefc2 (diff)
downloadrneovim-710002c820e5a55e3b234074fefb84ab745e11a3.tar.gz
rneovim-710002c820e5a55e3b234074fefb84ab745e11a3.tar.bz2
rneovim-710002c820e5a55e3b234074fefb84ab745e11a3.zip
job: Close the process in a queued event handler
Since all reads are queued by the event loop, we must also queue the exit event, or else the process_close function can close the job streams before received data is processed.
-rw-r--r--src/nvim/os/job.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/nvim/os/job.c b/src/nvim/os/job.c
index 898d875ea3..ccd7891601 100644
--- a/src/nvim/os/job.c
+++ b/src/nvim/os/job.c
@@ -406,6 +406,12 @@ static void close_cb(uv_handle_t *handle)
job_decref(handle_get_job(handle));
}
+static void job_exited(Event event)
+{
+ Job *job = event.data;
+ process_close(job);
+}
+
static void chld_handler(uv_signal_t *handle, int signum)
{
int stat = 0;
@@ -433,7 +439,12 @@ static void chld_handler(uv_signal_t *handle, int signum)
} else if (WIFSIGNALED(stat)) {
job->status = WTERMSIG(stat);
}
- process_close(job);
+ if (exiting) {
+ // don't enqueue more events when exiting
+ process_close(job);
+ } else {
+ event_push((Event) {.handler = job_exited, .data = job}, false);
+ }
break;
}
}