diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-03-25 08:52:40 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-03-25 18:57:35 -0300 |
commit | 710002c820e5a55e3b234074fefb84ab745e11a3 (patch) | |
tree | 425b494b0513dfad92cec50a1f4acf61c8cf6449 | |
parent | 727f5241679c4c0da65810204a33e248739aefc2 (diff) | |
download | rneovim-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.c | 13 |
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; } } |