]> granicus.if.org Git - vim/commitdiff
patch 7.4.2297 v7.4.2297
authorBram Moolenaar <Bram@vim.org>
Thu, 1 Sep 2016 12:35:22 +0000 (14:35 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 1 Sep 2016 12:35:22 +0000 (14:35 +0200)
Problem:    When starting a job that reads from a buffer and reaching the end,
            the job hangs.
Solution:   Close the pipe or socket when all lines were read.

src/channel.c
src/testdir/test_channel.vim
src/version.c

index 25406e184e90514208451db529ba542e41be37a6..dbed65932996525763ee924f1449b0862641c976 100644 (file)
@@ -1424,11 +1424,14 @@ channel_write_in(channel_T *channel)
        ch_logn(channel, "written %d lines to channel", written);
 
     in_part->ch_buf_top = lnum;
-    if (lnum > buf->b_ml.ml_line_count)
+    if (lnum > buf->b_ml.ml_line_count || lnum > in_part->ch_buf_bot)
     {
        /* Writing is done, no longer need the buffer. */
        in_part->ch_bufref.br_buf = NULL;
        ch_log(channel, "Finished writing all lines to channel");
+
+       /* Close the pipe/socket, so that the other side gets EOF. */
+       may_close_part(&channel->CH_IN_FD);
     }
     else
        ch_logn(channel, "Still %d more lines to write",
index a038d4a2dff19ee379b42713d32d2cdec5ac4e94..6bea0e8b96238c120b97ffc8ac98ea0f963b411d 100644 (file)
@@ -792,6 +792,46 @@ func Test_pipe_from_buffer_nr()
   call Run_test_pipe_from_buffer(0)
 endfunc
 
+func Run_pipe_through_sort(all)
+  if !executable('sort') || !has('job')
+    return
+  endif
+  split sortin
+  call setline(1, ['ccc', 'aaa', 'ddd', 'bbb', 'eee'])
+  let options = {'in_io': 'buffer', 'in_name': 'sortin',
+       \ 'out_io': 'buffer', 'out_name': 'sortout'}
+  if !a:all
+    let options.in_top = 2
+    let options.in_bot = 4
+  endif
+  let g:job = job_start('sort', options)
+  call assert_equal("run", job_status(g:job))
+  call WaitFor('job_status(g:job) == "dead"')
+  call assert_equal("dead", job_status(g:job))
+  sp sortout
+  call assert_equal('Reading from channel output...', getline(1))
+  if a:all
+    call assert_equal(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], getline(2, 6))
+  else
+    call assert_equal(['aaa', 'bbb', 'ddd'], getline(2, 4))
+  endif
+
+  call job_stop(g:job)
+  unlet g:job
+  bwipe! sortin
+  bwipe! sortout
+endfunc
+
+func Test_pipe_through_sort_all()
+  call ch_log('Test_pipe_through_sort_all()')
+  call Run_pipe_through_sort(1)
+endfunc
+
+func Test_pipe_through_sort_some()
+  call ch_log('Test_pipe_through_sort_some()')
+  call Run_pipe_through_sort(0)
+endfunc
+
 func Test_pipe_to_nameless_buffer()
   if !has('job')
     return
index 95eec668fdf727176462a879fbb5939b55c7c6d3..3162f330fb42a26bf22ac442765f7325c388845b 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2297,
 /**/
     2296,
 /**/