From: Eli Zaretskii Date: Thu, 6 Dec 2012 18:36:22 +0000 (+0200) Subject: Avoid busy-waiting for child processes on Windows. (Bug#13086) X-Git-Tag: emacs-24.3.90~173^2~9^2~29 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e86f51344b4bc58f8342b360eaf3d2b2ca0c470a;p=emacs.git Avoid busy-waiting for child processes on Windows. (Bug#13086) src/w32proc.c (waitpid): Avoid busy-waiting when called with WNOHANG if the child process is still running. Instead, exit the wait loop and return zero. --- diff --git a/src/ChangeLog b/src/ChangeLog index 2fefef1275b..2a138bfcf65 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2012-12-06 Eli Zaretskii + + * w32proc.c (waitpid): Avoid busy-waiting when called with WNOHANG + if the child process is still running. Instead, exit the wait + loop and return zero. (Bug#13086) + 2012-12-06 Dmitry Antipov * frame.h (x_char_width, x_char_height): Remove prototypes. diff --git a/src/w32proc.c b/src/w32proc.c index 87af8682390..0b36804b0e8 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -1220,13 +1220,22 @@ waitpid (pid_t pid, int *status, int options) { QUIT; active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms); - } while (active == WAIT_TIMEOUT); + } while (active == WAIT_TIMEOUT && !dont_wait); if (active == WAIT_FAILED) { errno = EBADF; return -1; } + else if (active == WAIT_TIMEOUT && dont_wait) + { + /* PID specifies our subprocess, but it didn't exit yet, so its + status is not yet available. */ +#ifdef FULL_DEBUG + DebPrint (("Wait: PID %d not reap yet\n", cp->pid)); +#endif + return 0; + } else if (active >= WAIT_OBJECT_0 && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS) {