diff options
| author | Eli Zaretskii | 2012-12-06 20:36:22 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2012-12-06 20:36:22 +0200 |
| commit | e86f51344b4bc58f8342b360eaf3d2b2ca0c470a (patch) | |
| tree | c1b23e29dcebc986d13f719d23f001a8181496b4 /src/w32proc.c | |
| parent | 5b4d7e523f901916392de12fb93b80b6f472de1d (diff) | |
| download | emacs-e86f51344b4bc58f8342b360eaf3d2b2ca0c470a.tar.gz emacs-e86f51344b4bc58f8342b360eaf3d2b2ca0c470a.zip | |
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.
Diffstat (limited to 'src/w32proc.c')
| -rw-r--r-- | src/w32proc.c | 11 |
1 files changed, 10 insertions, 1 deletions
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) | |||
| 1220 | { | 1220 | { |
| 1221 | QUIT; | 1221 | QUIT; |
| 1222 | active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms); | 1222 | active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms); |
| 1223 | } while (active == WAIT_TIMEOUT); | 1223 | } while (active == WAIT_TIMEOUT && !dont_wait); |
| 1224 | 1224 | ||
| 1225 | if (active == WAIT_FAILED) | 1225 | if (active == WAIT_FAILED) |
| 1226 | { | 1226 | { |
| 1227 | errno = EBADF; | 1227 | errno = EBADF; |
| 1228 | return -1; | 1228 | return -1; |
| 1229 | } | 1229 | } |
| 1230 | else if (active == WAIT_TIMEOUT && dont_wait) | ||
| 1231 | { | ||
| 1232 | /* PID specifies our subprocess, but it didn't exit yet, so its | ||
| 1233 | status is not yet available. */ | ||
| 1234 | #ifdef FULL_DEBUG | ||
| 1235 | DebPrint (("Wait: PID %d not reap yet\n", cp->pid)); | ||
| 1236 | #endif | ||
| 1237 | return 0; | ||
| 1238 | } | ||
| 1230 | else if (active >= WAIT_OBJECT_0 | 1239 | else if (active >= WAIT_OBJECT_0 |
| 1231 | && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS) | 1240 | && active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS) |
| 1232 | { | 1241 | { |