summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sigproc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r--winsup/cygwin/sigproc.cc44
1 files changed, 14 insertions, 30 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index f31660ee1..9eae394e8 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -309,15 +309,6 @@ proc_subproc (DWORD what, DWORD val)
This will cause an eventual scan of waiters. */
break;
- /* A child is in the stopped state. Scan wait() queue to see if anyone
- * should be notified. (Called from wait_sig thread)
- */
- case PROC_CHILDSTOPPED:
- child = myself; // Just to avoid accidental NULL dereference
- sigproc_printf ("Received stopped notification");
- clearing = 0;
- goto scan_wait;
-
/* Handle a wait4() operation. Allocates an event for the calling
* thread which is signaled when the appropriate pid exits or stops.
* (usually called from the main thread)
@@ -480,7 +471,7 @@ proc_terminate (void)
void __stdcall
sig_clear (int sig)
{
- (void) InterlockedExchange (myself->getsigtodo(sig), 0L);
+ (void) InterlockedExchange (myself->getsigtodo (sig), 0L);
return;
}
@@ -703,7 +694,7 @@ sig_send (_pinfo *p, int sig, DWORD ebp)
/* Increment the sigtodo array to signify which signal to assert.
*/
- (void) InterlockedIncrement (p->getsigtodo(sig));
+ (void) InterlockedIncrement (p->getsigtodo (sig));
/* Notify the process that a signal has arrived.
*/
@@ -790,7 +781,7 @@ out:
void __stdcall
sig_set_pending (int sig)
{
- (void) InterlockedIncrement (myself->getsigtodo(sig));
+ (void) InterlockedIncrement (myself->getsigtodo (sig));
return;
}
@@ -1134,7 +1125,6 @@ wait_sig (VOID *)
}
rc -= WAIT_OBJECT_0;
- int dispatched = FALSE;
sigproc_printf ("awake");
/* A sigcatch semaphore has been signaled. Scan the sigtodo
* array looking for any unprocessed signals.
@@ -1145,7 +1135,7 @@ wait_sig (VOID *)
int dispatched_sigchld = 0;
for (int sig = -__SIGOFFSET; sig < NSIG; sig++)
{
- while (InterlockedDecrement (myself->getsigtodo(sig)) >= 0)
+ while (InterlockedDecrement (myself->getsigtodo (sig)) >= 0)
{
if (sig == SIGCHLD)
saw_sigchld = 1;
@@ -1171,37 +1161,31 @@ wait_sig (VOID *)
// proc_strace (); // Dump cached strace.prntf stuff.
break;
- /* Signalled from a child process that it has stopped */
- case __SIGCHILDSTOPPED:
- sigproc_printf ("Received child stopped notification");
- dispatched |= sig_handle (SIGCHLD);
- if (proc_subproc (PROC_CHILDSTOPPED, 0))
- dispatched |= 1;
- break;
-
/* A normal UNIX signal */
default:
sigproc_printf ("Got signal %d", sig);
int wasdispatched = sig_handle (sig);
- dispatched |= wasdispatched;
if (sig == SIGCHLD && wasdispatched)
dispatched_sigchld = 1;
+ /* Need to decrement again to offset increment below since
+ we really do want to decrement in this case. */
+ InterlockedDecrement (myself->getsigtodo (sig));
goto nextsig;
}
}
+
+ nextsig:
/* Decremented too far. */
- if (InterlockedIncrement (myself->getsigtodo(sig)) > 0)
+ if (InterlockedIncrement (myself->getsigtodo (sig)) > 0)
saw_pending_signals = 1;
- nextsig:
- continue;
}
- /* FIXME: The dispatched stuff probably isn't needed anymore. */
- if (dispatched >= 0 && pending_signals < 0 && !saw_pending_signals)
+ if (pending_signals < 0 && !saw_pending_signals)
pending_signals = 0;
- if (nzombies && saw_sigchld && !dispatched_sigchld)
+ if (saw_sigchld)
proc_subproc (PROC_CLEARWAIT, 0);
+
/* Signal completion of signal handling depending on which semaphore
* woke up the WaitForMultipleObjects above.
*/
@@ -1209,6 +1193,7 @@ wait_sig (VOID *)
{
case 0:
SetEvent (sigcomplete_main);
+ sigproc_printf ("set main thread completion event");
break;
case 1:
ReleaseSemaphore (sigcomplete_nonmain, 1, NULL);
@@ -1217,7 +1202,6 @@ wait_sig (VOID *)
/* Signal from another process. No need to synchronize. */
break;
}
-
sigproc_printf ("looping");
}