summaryrefslogtreecommitdiff
path: root/winsup/cygwin/signal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/signal.cc')
-rw-r--r--winsup/cygwin/signal.cc15
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;
}