diff options
author | Christopher Faylor <me@cgf.cx> | 2004-03-14 06:34:05 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2004-03-14 06:34:05 +0000 |
commit | f8a8e7a1f6364f620685406cf9f3a9770b1d5789 (patch) | |
tree | 5405c4afeb2e3706083ed6e2fccf951e63868a9f /winsup/cygwin/sigproc.cc | |
parent | 8308950ca5611565b842800e285ad4c8378344f5 (diff) | |
download | cygnal-f8a8e7a1f6364f620685406cf9f3a9770b1d5789.tar.gz cygnal-f8a8e7a1f6364f620685406cf9f3a9770b1d5789.tar.bz2 cygnal-f8a8e7a1f6364f620685406cf9f3a9770b1d5789.zip |
* cygtls.cc (_cygtls::remove): Call remove_wq to ensure that wait stuff is
removed from proc_subproc linked list.
* cygtls.h (_cygtls::remove_wq): Declare.
* sigproc.cc (_cygtls::remove_wq): Define.
(proc_subproc): Label event handle appropriately.
* spawn.cc (spawn_guts): Return -1 when wait() fails for spawn types that
require waiting.
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r-- | winsup/cygwin/sigproc.cc | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 9c3b200b6..30318a7e1 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -401,7 +401,7 @@ proc_subproc (DWORD what, DWORD val) { wval->ev = wval->thread_ev = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - ProtectHandle (wval->ev); + ProtectHandle1 (wval->ev, wq_ev); } ResetEvent (wval->ev); @@ -469,6 +469,21 @@ out1: return rc; } +// FIXME: This is inelegant +void +_cygtls::remove_wq () +{ + sync_proc_subproc->acquire (); + for (waitq *w = &waitq_head; w->next != NULL; w = w->next) + if (w->next == &wq) + { + ForceCloseHandle1 (wq.thread_ev, wq_ev); + w->next = wq.next; + break; + } + sync_proc_subproc->release (); +} + /* Terminate the wait_subproc thread. * Called on process exit. * Also called by spawn_guts to disassociate any subprocesses from this |