diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2012-12-06 20:36:22 +0200 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2012-12-06 20:36:22 +0200 |
| commit | e86f51344b4bc58f8342b360eaf3d2b2ca0c470a (patch) | |
| tree | c1b23e29dcebc986d13f719d23f001a8181496b4 | |
| parent | 5b4d7e523f901916392de12fb93b80b6f472de1d (diff) | |
| download | emacs-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/ChangeLog | 6 | ||||
| -rw-r--r-- | src/w32proc.c | 11 |
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) { |
