aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-11-07 02:38:12 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-11-07 09:12:42 -0300
commitd3f81424e5a8de5d184f3ab3e14b632fa70f857d (patch)
tree98add394ba9ad6711af148a7ac24520cc9e79604
parentf7a468c1e76a1b2fb4ccf436fc9d50174b88b412 (diff)
downloadrneovim-d3f81424e5a8de5d184f3ab3e14b632fa70f857d.tar.gz
rneovim-d3f81424e5a8de5d184f3ab3e14b632fa70f857d.tar.bz2
rneovim-d3f81424e5a8de5d184f3ab3e14b632fa70f857d.zip
job: Only force-close stdout/stderr when the job exits
stdout/stderr should only be closed after the job truly exits, or else we can lose data sent by it.
-rw-r--r--src/nvim/os/job.c6
-rw-r--r--test/functional/job/job_spec.lua14
2 files changed, 17 insertions, 3 deletions
diff --git a/src/nvim/os/job.c b/src/nvim/os/job.c
index 2f610cb51f..7ae2a86fc2 100644
--- a/src/nvim/os/job.c
+++ b/src/nvim/os/job.c
@@ -270,10 +270,10 @@ void job_stop(Job *job)
}
job->stopped_time = os_hrtime();
- // Close the standard streams of the job
+ // Close the job's stdin. If the job doesn't close it's own stdout/stderr,
+ // they will be closed when the job exits(possibly due to being terminated
+ // after a timeout)
close_job_in(job);
- close_job_out(job);
- close_job_err(job);
if (!stop_requests++) {
// When there's at least one stop request pending, start a timer that
diff --git a/test/functional/job/job_spec.lua b/test/functional/job/job_spec.lua
index b2a65f8269..9046d85f10 100644
--- a/test/functional/job/job_spec.lua
+++ b/test/functional/job/job_spec.lua
@@ -15,6 +15,10 @@ describe('jobs', function()
return "au! JobActivity xxx call rpcnotify("..channel..", "..expr..")"
end
+ local notify_job = function()
+ return "au! JobActivity xxx call rpcnotify("..channel..", 'j', v:job_data)"
+ end
+
it('returns 0 when it fails to start', function()
local status, rv = pcall(eval, "jobstart('', '')")
eq(false, status)
@@ -56,4 +60,14 @@ describe('jobs', function()
it('will not cause a memory leak if we leave a job running', function()
nvim('command', "call jobstart('xxx', 'cat', ['-'])")
end)
+
+ it('will only emit the "exit" event after "stdout" and "stderr"', function()
+ nvim('command', notify_job())
+ nvim('command', "let j = jobstart('xxx', 'cat', ['-'])")
+ local jobid = nvim('eval', 'j')
+ nvim('eval', 'jobsend(j, "abc\ndef")')
+ nvim('eval', 'jobstop(j)')
+ eq({'notification', 'j', {{jobid, 'stdout', 'abc\ndef'}}}, next_message())
+ eq({'notification', 'j', {{jobid, 'exit'}}}, next_message())
+ end)
end)