# HG changeset patch # User Karl Heuer # Date 797653636 0 # Node ID 96fa39ad940327d4cb72c10473258eefc398255d # Parent b2d5260a5da0fdae3164cb83a9243ea0a9e3cdcc (win32_wait): Reap synchronous subprocesses, and place return code in synch_process_retcode. diff -r b2d5260a5da0 -r 96fa39ad9403 src/w32proc.c --- a/src/w32proc.c Wed Apr 12 02:25:05 1995 +0000 +++ b/src/w32proc.c Wed Apr 12 02:27:16 1995 +0000 @@ -1,5 +1,5 @@ /* Process support for Windows NT port of GNU EMACS. - Copyright (C) 1992 Free Software Foundation, Inc. + Copyright (C) 1992, 1995 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -320,6 +320,11 @@ /* Wait for any of our existing child processes to die When it does, close its handle Return the pid and fill in the status if non-NULL. */ + +/* From callproc.c */ +extern int synch_process_alive; +extern int synch_process_retcode; + int win32_wait (int *status) { @@ -392,16 +397,22 @@ } cp = cps[active]; -#ifdef FULL_DEBUG - DebPrint (("Wait signaled with process pid %d\n", cp->pid)); -#endif - + if (status) { - /* In process.c the default WAITTYPE is defined. - Since we can't determine anything about why a process died - we can only return a code that looks like WIFEXITED */ - *status = (retval & 0x7fffff) << 8; + *status = retval; + } + else if (synch_process_alive) + { + synch_process_alive = 0; + synch_process_retcode = retval; + + TerminateThread (cp->thrd, 0); + CloseHandle (cp->thrd); + CloseHandle (cp->char_consumed); + CloseHandle (cp->char_avail); + CloseHandle (cp->process); + DEACTIVATE_CHILD (cp); } return cp->pid; @@ -522,8 +533,8 @@ extern int proc_buffered_char[]; int -select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, - EMACS_TIME *timeout) +sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, + EMACS_TIME *timeout) { SELECT_TYPE orfds; DWORD timeout_ms; @@ -535,7 +546,11 @@ /* If the descriptor sets are NULL but timeout isn't, then just Sleep. */ if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL) { +#ifdef HAVE_TIMEVAL + Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000); +#else Sleep ((*timeout) * 1000); +#endif return 0; } @@ -598,7 +613,12 @@ /* Nothing to look for, so we didn't find anything */ if (nh == 0) { - Sleep ((*timeout) * 1000); + if (timeout) +#ifdef HAVE_TIMEVAL + Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000); +#else + Sleep ((*timeout) * 1000); +#endif return 0; } @@ -612,7 +632,11 @@ so the reader thread will signal an error condition, thus, the wait will wake up */ +#ifdef HAVE_TIMEVAL + timeout_ms = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : INFINITE; +#else timeout_ms = timeout ? *timeout*1000 : INFINITE; +#endif active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms); if (active == WAIT_FAILED) {