To: vim_dev@googlegroups.com Subject: Patch 7.4.2297 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2297 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. Files: src/channel.c, src/testdir/test_channel.vim *** ../vim-7.4.2296/src/channel.c 2016-08-29 22:48:12.113106491 +0200 --- src/channel.c 2016-09-01 14:33:06.551900688 +0200 *************** *** 1424,1434 **** ch_logn(channel, "written %d lines to channel", written); in_part->ch_buf_top = lnum; ! if (lnum > buf->b_ml.ml_line_count) { /* Writing is done, no longer need the buffer. */ in_part->ch_bufref.br_buf = NULL; ch_log(channel, "Finished writing all lines to channel"); } else ch_logn(channel, "Still %d more lines to write", --- 1424,1437 ---- ch_logn(channel, "written %d lines to channel", written); in_part->ch_buf_top = lnum; ! 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", *** ../vim-7.4.2296/src/testdir/test_channel.vim 2016-08-28 19:26:39.624111889 +0200 --- src/testdir/test_channel.vim 2016-09-01 14:21:31.461858740 +0200 *************** *** 792,797 **** --- 792,837 ---- 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 *** ../vim-7.4.2296/src/version.c 2016-08-31 20:33:22.755268342 +0200 --- src/version.c 2016-09-01 14:34:30.447179210 +0200 *************** *** 765,766 **** --- 765,768 ---- { /* Add new patch number below this line */ + /**/ + 2297, /**/ -- hundred-and-one symptoms of being an internet addict: 123. You ask the car dealer to install an extra cigarette lighter on your new car to power your notebook. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///