* sigproc.cc (sigheld): Define new variable.

(sig_dispatch_pending): Don't check sigq since that's racy.
(sig_send): Set sigheld flag if __SIGHOLD is specified, reset it if __SIGNOHOLD
is specified.  Ignore flush signals if we're holding signals.
This commit is contained in:
Christopher Faylor 2006-02-24 21:40:28 +00:00
parent ff20d12a66
commit ad37df4814
2 changed files with 26 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2006-02-24 Christopher Faylor <cgf@timesys.com>
* sigproc.cc (sigheld): Define new variable.
(sig_dispatch_pending): Don't check sigq since that's racy.
(sig_send): Set sigheld flag if __SIGHOLD is specified, reset it if
__SIGNOHOLD is specified. Ignore flush signals if we're holding
signals.
2006-02-23 Christopher Faylor <cgf@timesys.com>
* cygwin.din (_exit): Use signal front end.

View File

@ -64,6 +64,7 @@ HANDLE NO_COPY sigCONT; // Used to "STOP" a process
Static cygthread *hwait_sig;
Static HANDLE wait_sig_inited; // Control synchronization of
// message queue startup
Static bool sigheld; // True if holding signals
Static int nprocs; // Number of deceased children
Static char cprocs[(NPROCS + 1) * sizeof (pinfo)];// All my children info
@ -440,7 +441,7 @@ sigpending (sigset_t *mask)
void __stdcall
sig_dispatch_pending (bool fast)
{
if (exit_state || &_my_tls == _sig_tls || !sigq.start.next)
if (exit_state || &_my_tls == _sig_tls)
{
#ifdef DEBUGGING
sigproc_printf ("exit_state %d, cur thread id %p, _sig_tls %p, sigq.start.next %p",
@ -512,8 +513,22 @@ sigproc_terminate (exit_states es)
int __stdcall
sig_send (_pinfo *p, int sig)
{
if (sig == __SIGNOHOLD)
SetEvent (sigCONT);
if (sig == __SIGHOLD)
sigheld = true;
else if (!sigheld)
/* nothing */;
else if (sig != __SIGNOHOLD && sig != __SIGFLUSH && sig != __SIGFLUSHFAST)
{
#ifdef DEBUGGING
system_printf ("internal signal sent while signals are on hold");
#endif
return -1;
}
else
{
SetEvent (sigCONT);
sigheld = false;
}
siginfo_t si = {0};
si.si_signo = sig;
si.si_code = SI_KERNEL;