diff options
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 9889d4d260b..49b04c7c87d 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -610,8 +610,19 @@ sig_handle_tty_stop (int sig) } sigproc_printf ("process %d stopped by signal %d, myself->ppid_handle %p", myself->pid, sig, myself->ppid_handle); - if (WaitForSingleObject (sigCONT, INFINITE) != WAIT_OBJECT_0) - api_fatal ("WaitSingleObject failed, %E"); + HANDLE w4[2]; + w4[0] = sigCONT; + w4[1] = signal_arrived; + switch (WaitForMultipleObjects (2, w4, TRUE, INFINITE)) + { + case WAIT_OBJECT_0: + case WAIT_OBJECT_0 + 1: + reset_signal_arrived (); + break; + default: + api_fatal ("WaitSingleObject failed, %E"); + break; + } return; } } @@ -891,9 +902,12 @@ set_signal_mask (sigset_t newmask, sigset_t oldmask) int __stdcall sig_handle (int sig, sigset_t mask, int pid, _threadinfo *tls) { - if (sig == SIGCONT) + DWORD continue_now; + if (sig != SIGCONT) + continue_now = false; + else { - DWORD stopped = myself->process_state & PID_STOPPED; + continue_now = myself->process_state & PID_STOPPED; myself->stopsig = 0; myself->process_state &= ~PID_STOPPED; /* Clear pending stop signals */ @@ -901,8 +915,6 @@ sig_handle (int sig, sigset_t mask, int pid, _threadinfo *tls) sig_clear (SIGTSTP); sig_clear (SIGTTIN); sig_clear (SIGTTOU); - if (stopped) - SetEvent (sigCONT); } int rc = 1; @@ -952,6 +964,8 @@ sig_handle (int sig, sigset_t mask, int pid, _threadinfo *tls) || sig == SIGURG) { sigproc_printf ("default signal %d ignored", sig); + if (continue_now) + SetEvent (signal_arrived); goto done; } @@ -985,6 +999,8 @@ dosig: rc = setup_handler (sig, handler, thissig, tls ?: _main_tls); done: + if (continue_now) + SetEvent (sigCONT); sigproc_printf ("returning %d", rc); return rc; |