diff options
Diffstat (limited to 'winsup/cygwin/signal.cc')
-rw-r--r-- | winsup/cygwin/signal.cc | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc index 492ca3b24da..72664b10d1e 100644 --- a/winsup/cygwin/signal.cc +++ b/winsup/cygwin/signal.cc @@ -483,7 +483,8 @@ extern "C" int sigwait (const sigset_t *set, int *sig) { pthread_testcancel (); - _my_tls.event = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); + HANDLE h; + h = _my_tls.event = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); if (!_my_tls.event) { __seterrno (); @@ -492,16 +493,20 @@ sigwait (const sigset_t *set, int *sig) _my_tls.sigwait_mask = *set; + int res; switch (WaitForSingleObject (_my_tls.event, INFINITE)) { case WAIT_OBJECT_0: - CloseHandle (_my_tls.event); - _my_tls.event = NULL; *sig = InterlockedExchange ((LONG *) &_my_tls.sig, (LONG) 0); + res = 0; break; default: __seterrno (); - return -1; + res = -1; } - return 0; + _my_tls.event = NULL; + _my_tls.sig = 0; + CloseHandle (h); + sig_dispatch_pending (); + return res; } |