Patch 8.1.0889
Problem: MS-Windows: a channel write may hang.
Solution: Check for WriteFile() not writing anything. (Yasuhiro Matsumoto,
closes #3920)
Files: src/channel.c, src/testdir/test_channel.vim,
src/testdir/test_channel_pipe.py
*** ../vim-8.1.0888/src/channel.c 2019-02-08 12:46:03.584784210 +0100
--- src/channel.c 2019-02-10 22:23:11.048518527 +0100
***************
*** 91,99 ****
size = MAX_NAMED_PIPE_SIZE;
else
size = (DWORD)todo;
! // If the pipe overflows while the job does not read the data, WriteFile
! // will block forever. This abandons the write.
memset(&ov, 0, sizeof(ov));
if (!WriteFile(h, buf + done, size, &nwrite, &ov))
{
DWORD err = GetLastError();
--- 91,100 ----
size = MAX_NAMED_PIPE_SIZE;
else
size = (DWORD)todo;
! // If the pipe overflows while the job does not read the data,
! // WriteFile() will block forever. This abandons the write.
memset(&ov, 0, sizeof(ov));
+ nwrite = 0;
if (!WriteFile(h, buf + done, size, &nwrite, &ov))
{
DWORD err = GetLastError();
***************
*** 104,109 ****
--- 105,114 ----
return -1;
FlushFileBuffers(h);
}
+ else if (nwrite == 0)
+ // WriteFile() returns TRUE but did not write anything. This causes
+ // a hang, so bail out.
+ break;
todo -= nwrite;
done += nwrite;
}
*** ../vim-8.1.0888/src/testdir/test_channel.vim 2019-01-31
15:52:05.269907631 +0100
--- src/testdir/test_channel.vim 2019-02-10 22:16:00.363647792 +0100
***************
*** 2003,2008 ****
--- 2003,2022 ----
endtry
endfunc
+ func Test_no_hang_windows()
+ if !has('job') || !has('win32')
+ return
+ endif
+
+ try
+ let job = job_start(s:python . " test_channel_pipe.py busy",
+ \ {'mode': 'raw', 'drop': 'never', 'noblock': 0})
+ call assert_fails('call ch_sendraw(job, repeat("X", 80000))', 'E631:')
+ finally
+ call job_stop(job)
+ endtry
+ endfunc
+
func Test_job_exitval_and_termsig()
if !has('unix')
return
*** ../vim-8.1.0888/src/testdir/test_channel_pipe.py 2019-01-24
23:11:44.635650160 +0100
--- src/testdir/test_channel_pipe.py 2019-02-10 22:16:00.363647792 +0100
***************
*** 18,23 ****
--- 18,26 ----
print(sys.argv[1], end='')
sys.stdout.flush()
sys.exit(0)
+ elif sys.argv[1].startswith("busy"):
+ time.sleep(100)
+ sys.exit(0)
else:
print(sys.argv[1])
sys.stdout.flush()
*** ../vim-8.1.0888/src/version.c 2019-02-10 22:14:24.184352831 +0100
--- src/version.c 2019-02-10 22:17:35.942949889 +0100
***************
*** 785,786 ****
--- 785,788 ----
{ /* Add new patch number below this line */
+ /**/
+ 889,
/**/
--
[The rest of the ARMY stand around looking at a loss.]
INSPECTOR END OF FILM: (picks up megaphone) All right! Clear off! Go on!
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.