* cygtls.h (waitq): Declare structure here.

(_cygtls::wq): Declare.
* cygtls.cc (_cygtls::fixup_after_fork): Clear wq.thread_ev to avoid using an
invalid event handle in forked process.
* dcrt0.cc (waitq_storage): Delete.
(threadstuff): Remove waitq_storage.
* perthread.h (per_thread_waitq): Delete.
(waitq_storage): Delete declaration.
* sigproc.cc (sigproc_init): Remove perthread waitq consideration.
* sigproc.h (waitq): Delete declaration.
* wait.cc (wait4): Use _my_tls waitq structure rather than per_thread.
* cygtls.h (_cygtls::newmask): Delete member.
(_cygtls::deltamask): New member.
* gendef (_sigdelayed): Replace the call to set_process_mask by a call to
set_process_mask_delta.
* exceptions.cc (handle_sigsuspend): Do not filter tempmask.  Or
SIG_NONMASKABLE in deltamask as a flag.
(_cygtls::interrupt_setup): Set deltamask only.
(set_process_mask_delta): New function.
(_cygtls::call_signal_handler): Replace the first call to set_process_mask by a
call to set_process_mask_delta.
* tlsoffsets.h: Regenerate.
This commit is contained in:
Christopher Faylor
2004-03-12 03:09:28 +00:00
parent 7ea8e226ee
commit 9863b78e7b
11 changed files with 134 additions and 109 deletions

View File

@ -570,8 +570,7 @@ handle_sigsuspend (sigset_t tempmask)
{
sigset_t oldmask = myself->getsigmask (); // Remember for restoration
// Let signals we're interested in through.
set_signal_mask (tempmask &= ~SIG_NONMASKABLE, oldmask);
set_signal_mask (tempmask, oldmask);
sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask);
pthread_testcancel ();
@ -581,8 +580,9 @@ handle_sigsuspend (sigset_t tempmask)
/* A signal dispatch function will have been added to our stack and will
be hit eventually. Set the old mask to be restored when the signal
handler returns. */
handler returns and indicate its presence by modifying deltamask. */
_my_tls.deltamask |= SIG_NONMASKABLE;
_my_tls.oldmask = oldmask; // Will be restored by signal handler
return -1;
}
@ -671,8 +671,7 @@ void __stdcall
_cygtls::interrupt_setup (int sig, void *handler, struct sigaction& siga)
{
push ((__stack_t) sigdelayed, false);
oldmask = myself->getsigmask ();
newmask = oldmask | siga.sa_mask | SIGTOMASK (sig);
deltamask = (siga.sa_mask | SIGTOMASK (sig)) & ~SIG_NONMASKABLE;
sa_flags = siga.sa_flags;
func = (void (*) (int)) handler;
saved_errno = -1; // Flag: no errno to save
@ -900,6 +899,27 @@ sighold (int sig)
return 0;
}
/* Update the signal mask for this process
and return the old mask.
Called from sigdelayed */
extern "C" sigset_t
set_process_mask_delta ()
{
mask_sync->acquire (INFINITE);
sigset_t newmask, oldmask;
if (_my_tls.deltamask & SIG_NONMASKABLE)
oldmask = _my_tls.oldmask; /* from handle_sigsuspend */
else
oldmask = myself->getsigmask ();
newmask = (oldmask | _my_tls.deltamask) & ~SIG_NONMASKABLE;
sigproc_printf ("oldmask %p, newmask %p, deltamask %p", oldmask, newmask,
_my_tls.deltamask);
myself->setsigmask (newmask);
mask_sync->release ();
return oldmask;
}
/* Set the signal mask for this process.
Note that some signals are unmaskable, as in UNIX. */
extern "C" void __stdcall
@ -1152,14 +1172,13 @@ _cygtls::call_signal_handler ()
(void) pop ();
reset_signal_arrived ();
sigset_t this_oldmask = oldmask;
sigset_t this_oldmask = set_process_mask_delta ();
int this_errno = saved_errno;
set_process_mask (newmask);
incyg--;
sig = 0;
sigfunc (thissig);
incyg++;
set_process_mask (this_oldmask);
set_signal_mask (this_oldmask);
if (this_errno >= 0)
set_errno (this_errno);
}