From e86f51344b4bc58f8342b360eaf3d2b2ca0c470a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 6 Dec 2012 20:36:22 +0200 Subject: [PATCH] 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. --- src/ChangeLog | 6 ++++++ src/w32proc.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) 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) { -- 2.39.5