summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2012-12-06 20:36:22 +0200
committerEli Zaretskii <eliz@gnu.org>2012-12-06 20:36:22 +0200
commite86f51344b4bc58f8342b360eaf3d2b2ca0c470a (patch)
treec1b23e29dcebc986d13f719d23f001a8181496b4
parent5b4d7e523f901916392de12fb93b80b6f472de1d (diff)
downloademacs-e86f51344b4bc58f8342b360eaf3d2b2ca0c470a.tar.gz
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.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/w32proc.c11
2 files changed, 16 insertions, 1 deletions
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 <eliz@gnu.org>
+
+ * 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 <dmantipov@yandex.ru>
* 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)
{