From: Eli Zaretskii Date: Sat, 29 Dec 2012 10:09:49 +0000 (+0200) Subject: More cleanup in handling subprocess exiting on MS-Windows. X-Git-Tag: emacs-24.3.90~173^2~7^2~457 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e7ae8039c346fd296c49ceedb718896bf4b27d9a;p=emacs.git More cleanup in handling subprocess exiting on MS-Windows. src/w32proc.c (reader_thread): Avoid passing NULL handles to SetEvent and WaitForSingleObject. --- diff --git a/src/ChangeLog b/src/ChangeLog index 79d1982cc0e..76f6865972c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-12-29 Eli Zaretskii + + * w32proc.c (reader_thread): Avoid passing NULL handles to + SetEvent and WaitForSingleObject. + 2012-12-28 Paul Eggert Port EXTERNALLY_VISIBLE to Clang 3.2. diff --git a/src/w32proc.c b/src/w32proc.c index 5c43a57db29..8977ca38a15 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -970,6 +970,11 @@ reader_thread (void *arg) else rc = _sys_read_ahead (cp->fd); + /* Don't bother waiting for the event if we already have been + told to exit by delete_child. */ + if (cp->status == STATUS_READ_ERROR || !cp->char_avail) + break; + /* The name char_avail is a misnomer - it really just means the read-ahead has completed, whether successfully or not. */ if (!SetEvent (cp->char_avail)) @@ -986,6 +991,11 @@ reader_thread (void *arg) if (rc == STATUS_READ_FAILED) break; + /* Don't bother waiting for the acknowledge if we already have + been told to exit by delete_child. */ + if (cp->status == STATUS_READ_ERROR || !cp->char_consumed) + break; + /* Wait until our input is acknowledged before reading again */ if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0) { @@ -993,6 +1003,8 @@ reader_thread (void *arg) "%lu for fd %ld\n", GetLastError (), cp->fd)); break; } + /* delete_child sets status to STATUS_READ_ERROR when it wants + us to exit. */ if (cp->status == STATUS_READ_ERROR) break; }