To: vim_dev@googlegroups.com Subject: Patch 8.1.0818 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0818 Problem: MS-Windows: cannot send large data with ch_sendraw(). Solution: Split write into several WriteFile() calls. (Yasuhiro Matsumoto, closes #3823) Files: src/channel.c, src/os_win32.c, src/testdir/test_channel.vim, src/testdir/test_channel_pipe.py, src/vim.h *** ../vim-8.1.0817/src/channel.c 2019-01-22 23:01:36.943693467 +0100 --- src/channel.c 2019-01-24 23:04:15.428107841 +0100 *************** *** 80,103 **** static int fd_write(sock_T fd, char *buf, size_t len) { HANDLE h = (HANDLE)fd; ! DWORD nwrite; OVERLAPPED ov; ! // 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, (DWORD)len, &nwrite, &ov)) { ! DWORD err = GetLastError(); ! if (err != ERROR_IO_PENDING) ! return -1; ! if (!GetOverlappedResult(h, &ov, &nwrite, FALSE)) ! return -1; ! FlushFileBuffers(h); } ! return (int)nwrite; } static void --- 80,113 ---- static int fd_write(sock_T fd, char *buf, size_t len) { + size_t todo = len; HANDLE h = (HANDLE)fd; ! DWORD nwrite, size, done = 0; OVERLAPPED ov; ! while (todo > 0) { ! if (todo > MAX_NAMED_PIPE_SIZE) ! size = MAX_NAMED_PIPE_SIZE; ! else ! size = 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(); ! if (err != ERROR_IO_PENDING) ! return -1; ! if (!GetOverlappedResult(h, &ov, &nwrite, FALSE)) ! return -1; ! FlushFileBuffers(h); ! } ! todo -= nwrite; ! done += nwrite; } ! return (int)done; } static void *** ../vim-8.1.0817/src/os_win32.c 2019-01-24 16:38:58.272712472 +0100 --- src/os_win32.c 2019-01-24 23:00:40.025605825 +0100 *************** *** 5369,5375 **** name, PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_NOWAIT, ! 1, 65535, 0, 0, NULL); if (handles[1] == INVALID_HANDLE_VALUE) return FALSE; --- 5369,5375 ---- name, PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_NOWAIT, ! 1, MAX_NAMED_PIPE_SIZE, 0, 0, NULL); if (handles[1] == INVALID_HANDLE_VALUE) return FALSE; *** ../vim-8.1.0817/src/testdir/test_channel.vim 2019-01-23 22:33:15.356020765 +0100 --- src/testdir/test_channel.vim 2019-01-24 23:00:40.025605825 +0100 *************** *** 1980,1982 **** --- 1980,2000 ---- unlet! g:val unlet! g:job endfunc + + func Test_raw_large_data() + try + let g:out = '' + let job = job_start(s:python . " test_channel_pipe.py", + \ {'mode': 'raw', 'drop': 'never', 'noblock': 1, + \ 'callback': {ch, msg -> execute('let g:out .= msg')}}) + + let want = repeat('X', 79999) . "\n" + call ch_sendraw(job, want) + let g:Ch_job = job + call WaitForAssert({-> assert_equal("dead", job_status(g:Ch_job))}) + call assert_equal(want, substitute(g:out, '\r', '', 'g')) + finally + call job_stop(job) + unlet g:out + endtry + endfunc *** ../vim-8.1.0817/src/testdir/test_channel_pipe.py 2017-12-09 18:22:43.000000000 +0100 --- src/testdir/test_channel_pipe.py 2019-01-24 23:00:40.025605825 +0100 *************** *** 56,59 **** --- 56,63 ---- if typed.startswith("doubleerr "): print(typed[10:-1] + "\nAND " + typed[10:-1], file=sys.stderr) sys.stderr.flush() + if typed.startswith("XXX"): + print(typed, end='') + sys.stderr.flush() + break *** ../vim-8.1.0817/src/vim.h 2019-01-24 18:20:14.436543394 +0100 --- src/vim.h 2019-01-24 23:00:40.025605825 +0100 *************** *** 2467,2472 **** --- 2467,2476 ---- # define MAX_OPEN_CHANNELS 0 #endif + #if defined(WIN32) + # define MAX_NAMED_PIPE_SIZE 65535 + #endif + /* Options for json_encode() and json_decode. */ #define JSON_JS 1 /* use JS instead of JSON */ #define JSON_NO_NONE 2 /* v:none item not allowed */ *** ../vim-8.1.0817/src/version.c 2019-01-24 22:42:14.949304772 +0100 --- src/version.c 2019-01-24 23:01:11.165389246 +0100 *************** *** 789,790 **** --- 789,792 ---- { /* Add new patch number below this line */ + /**/ + 818, /**/ -- Not too long ago, a program was something you watched on TV... /// 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 ///