From ed65ea18152636500399a7b6b75c87bac7d4ef2b Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 30 Jun 2018 11:43:42 +0300 Subject: [PATCH] Speed up reading sub-process output on MS-Windows * src/w32proc.c (syms_of_ntproc) : Set to zero. For the details, see this discussion: http://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00711.html. * src/w32.c (_sys_read_ahead): Update the commentary for w32-pipe-read-delay usage. * doc/emacs/msdos.texi (Windows Processes): Document w32-pipe-read-delay. * etc/NEWS: Mention the change of the value of w32-pipe-read-delay. --- doc/emacs/msdos.texi | 7 +++++++ etc/NEWS | 11 +++++++++++ src/w32.c | 15 ++++++++------- src/w32proc.c | 15 +++++++++------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/doc/emacs/msdos.texi b/doc/emacs/msdos.texi index 679bdd3e83b..c69c7d37f9b 100644 --- a/doc/emacs/msdos.texi +++ b/doc/emacs/msdos.texi @@ -808,6 +808,13 @@ communications with subprocesses to programs that exhibit unusual behavior with respect to buffering pipe I/O. @ifnottex +@vindex w32-pipe-read-delay + If you need to invoke MS-DOS programs as Emacs subprocesses, you may +see low rate of reading data from such programs. Setting the variable +@code{w32-pipe-read-delay} to a non-zero value may improve throughput +in these cases; we suggest the value of 50 for such situations. The +default is zero. + @findex w32-shell-execute The function @code{w32-shell-execute} can be useful for writing customized commands that run MS-Windows applications registered to diff --git a/etc/NEWS b/etc/NEWS index eb9169a7762..f5332c07828 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -851,6 +851,17 @@ retrieving values stored under a given key. It is intended to be used for supporting features such as XDG-like location of important files and directories. ++++ +** The default value of 'w32-pipe-read-delay' is now zero. +This speeds up reading output from sub-processes that produce a lot of +data. + +This variable may need to be non-zero only when running DOS programs +as Emacs subprocesses, which by now is not supported on modern +versions of MS-Windows. Set this variable to 50 if for some reason +you need the old behavior (and please report such situations to Emacs +developers). + ---------------------------------------------------------------------- This file is part of GNU Emacs. diff --git a/src/w32.c b/src/w32.c index e93aaab9ca1..c848b33b2af 100644 --- a/src/w32.c +++ b/src/w32.c @@ -8469,13 +8469,14 @@ _sys_read_ahead (int fd) { rc = _read (fd, &cp->chr, sizeof (char)); - /* Give subprocess time to buffer some more output for us before - reporting that input is available; we need this because Windows 95 - connects DOS programs to pipes by making the pipe appear to be - the normal console stdout - as a result most DOS programs will - write to stdout without buffering, ie. one character at a - time. Even some W32 programs do this - "dir" in a command - shell on NT is very slow if we don't do this. */ + /* Optionally give subprocess time to buffer some more output + for us before reporting that input is available; we may need + this because Windows 9X connects DOS programs to pipes by + making the pipe appear to be the normal console stdout -- as + a result most DOS programs will write to stdout without + buffering, i.e., one character at a time. Even some W32 + programs do this -- "dir" in a command shell on NT is very + slow if we don't do this. */ if (rc > 0) { int wait = w32_pipe_read_delay; diff --git a/src/w32proc.c b/src/w32proc.c index 28d7b6611f6..5934669c363 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -3763,14 +3763,17 @@ them blocking when trying to access unmounted drives etc. */); DEFVAR_INT ("w32-pipe-read-delay", w32_pipe_read_delay, doc: /* Forced delay before reading subprocess output. -This is done to improve the buffering of subprocess output, by -avoiding the inefficiency of frequently reading small amounts of data. +This may need to be done to improve the buffering of subprocess output, +by avoiding the inefficiency of frequently reading small amounts of data. +Typically needed only with DOS programs on Windows 9X; set to 50 if +throughput with such programs is slow. If positive, the value is the number of milliseconds to sleep before -reading the subprocess output. If negative, the magnitude is the number -of time slices to wait (effectively boosting the priority of the child -process temporarily). A value of zero disables waiting entirely. */); - w32_pipe_read_delay = 50; +signaling that output from a subprocess is ready to be read. +If negative, the value is the number of time slices to wait (effectively +boosting the priority of the child process temporarily). +A value of zero disables waiting entirely. */); + w32_pipe_read_delay = 0; DEFVAR_INT ("w32-pipe-buffer-size", w32_pipe_buffer_size, doc: /* Size of buffer for pipes created to communicate with subprocesses. -- 2.39.2