summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sigproc.cc
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-09-16 03:16:17 +0000
committerChristopher Faylor <me@cgf.cx>2005-09-16 03:16:17 +0000
commit882dfbf776f69b39aeb5f444525191327fb3a3d9 (patch)
tree978c5651bcb3ee3bd999240498f67126572fba1b /winsup/cygwin/sigproc.cc
parent150f3bd16864bfb1a8ab10904924fcee7feeb621 (diff)
downloadcygnal-882dfbf776f69b39aeb5f444525191327fb3a3d9.tar.gz
cygnal-882dfbf776f69b39aeb5f444525191327fb3a3d9.tar.bz2
cygnal-882dfbf776f69b39aeb5f444525191327fb3a3d9.zip
* pinfo.h (EXITCODE_SET): Move out of range of Windows error.
(EXITCODE_NOSET): Ditto. * sigproc.cc (no_signals_available): Remove check for hwait_sig. Just rely on my_sendsig. Pass in an argument controlling when it is appropriate to test EXITCODE_SET. (proc_can_be_signalled): Remove checks for myself since this function is never called in that context. (sigproc_init): Pre-initialize my_sendsig to non-zero so that proc_can_be_signalled will know that we expect to be signalable soon. (sig_send): Change debugging output.
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r--winsup/cygwin/sigproc.cc25
1 files changed, 8 insertions, 17 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index af87e1e02..3766df7ea 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -38,7 +38,7 @@ details. */
#define WSSC 60000 // Wait for signal completion
#define WPSP 40000 // Wait for proc_subproc mutex
-#define no_signals_available() (!hwait_sig || (myself->exitcode & EXITCODE_SET) || !my_sendsig || &_my_tls == _sig_tls)
+#define no_signals_available(x) (!my_sendsig || ((x) && myself->exitcode & EXITCODE_SET) || &_my_tls == _sig_tls)
#define NPROCS 256
@@ -59,7 +59,6 @@ HANDLE NO_COPY signal_arrived; // Event signaled when a signal has
#define Static static NO_COPY
HANDLE NO_COPY sigCONT; // Used to "STOP" a process
-Static cygthread *hwait_sig; // Handle of wait_sig thread
Static HANDLE wait_sig_inited; // Control synchronization of
// message queue startup
@@ -169,15 +168,6 @@ proc_can_be_signalled (_pinfo *p)
{
if (!(p->exitcode & EXITCODE_SET))
{
- if (p == myself_nowait || p == myself)
- if (hwait_sig)
- return true;
- else
- {
- set_errno (EAGAIN);
- return hwait_sig;
- }
-
if (ISSTATE (p, PID_INITIALIZING) ||
(((p)->process_state & (PID_ACTIVE | PID_IN_USE)) ==
(PID_ACTIVE | PID_IN_USE)))
@@ -487,7 +477,8 @@ sigproc_init ()
*/
sync_proc_subproc.init ("sync_proc_subproc");
- hwait_sig = new cygthread (wait_sig, cygself, "sig");
+ my_sendsig = INVALID_HANDLE_VALUE; // changed later
+ cygthread *hwait_sig = new cygthread (wait_sig, cygself, "sig");
hwait_sig->zap_h ();
global_sigs[SIGSTOP].sa_flags = SA_RESTART | SA_NODEFER;
@@ -550,10 +541,10 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
}
else
{
- if (no_signals_available ())
+ if (!my_sendsig || (si.si_signo != __SIGEXIT && myself->exitcode & EXITCODE_SET) || &_my_tls == _sig_tls)
{
- sigproc_printf ("hwait_sig %p, myself->sendsig %p, exit_state %d",
- hwait_sig, myself->sendsig, exit_state);
+ sigproc_printf ("my_sendsig %p, myself->sendsig %p, exit_state %d",
+ my_sendsig, myself->sendsig, exit_state);
set_errno (EAGAIN);
goto out; // Either exiting or not yet initializing
}
@@ -647,7 +638,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
}
else
{
- if (no_signals_available ())
+ if (no_signals_available (si.si_signo != __SIGEXIT))
sigproc_printf ("I'm going away now");
else if (!p->exec_sendsig)
system_printf ("error sending signal %d to pid %d, pipe handle %p, %E",
@@ -688,7 +679,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
rc = 0; // Successful exit
else
{
- if (!no_signals_available ())
+ if (!no_signals_available (true))
system_printf ("wait for sig_complete event failed, signal %d, rc %d, %E",
si.si_signo, rc);
set_errno (ENOSYS);