summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0818
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0818')
-rw-r--r--data/vim/patches/8.1.0818170
1 files changed, 170 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0818 b/data/vim/patches/8.1.0818
new file mode 100644
index 000000000..c0876a0fd
--- /dev/null
+++ b/data/vim/patches/8.1.0818
@@ -0,0 +1,170 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0818
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+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 ///