* cygtls.cc (_cygtls::handle_threadlist_exception): Make an error fatal.
* cygtls.h (sockaddr_in): Use header rather than defining our own structure. * exceptions.cc (_cygtls::interrupt_setup): Use exact contents of sa_mask rather than assuming tht current sig should be masked, too. (_cygtls::call_signal_handler): Use more aggressive locking. * gendef (_sigbe): Wait until later before releasing incyg. (_sigreturn): Remove more arguments to accommodate quasi-sa_sigaction support. (_sigdelayed): Push arguments for sa_sigaction. More work needed here. * signal.cc (sigaction): Implement SA_NODEFER. * tlsoffsets.h: Regenerate. * sigproc.cc (wait_sig): Use default buffer size of Windows 9x complains. * pinfo.cc (_onreturn::dummy_handle): Remove. (_onreturn::h): Make this a pointer. (_onreturn::~_onreturn): Detect whether pointer is NULL rather than value is NULL. (_onreturn::_onreturn): Set h to NULL initially. (_onreturn::no_close_p_handle): Set h to NULL. (winpids::add): Initialize onreturn with value from p.hProcess immediately.
This commit is contained in:
@ -50,7 +50,7 @@ static size_t windows_system_directory_length;
|
||||
/* This is set to indicate that we have already exited. */
|
||||
|
||||
static NO_COPY int exit_already = 0;
|
||||
static NO_COPY muto mask_sync;
|
||||
static muto NO_COPY mask_sync;
|
||||
|
||||
NO_COPY static struct
|
||||
{
|
||||
@ -706,7 +706,7 @@ void __stdcall
|
||||
_cygtls::interrupt_setup (int sig, void *handler, struct sigaction& siga)
|
||||
{
|
||||
push ((__stack_t) sigdelayed);
|
||||
deltamask = (siga.sa_mask | SIGTOMASK (sig)) & ~SIG_NONMASKABLE;
|
||||
deltamask = siga.sa_mask & ~SIG_NONMASKABLE;
|
||||
sa_flags = siga.sa_flags;
|
||||
func = (void (*) (int)) handler;
|
||||
saved_errno = -1; // Flag: no errno to save
|
||||
@ -982,8 +982,7 @@ sigrelse (int sig)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Update the signal mask for this process
|
||||
and return the old mask.
|
||||
/* Update the signal mask for this process and return the old mask.
|
||||
Called from sigdelayed */
|
||||
extern "C" sigset_t
|
||||
set_process_mask_delta ()
|
||||
@ -1253,7 +1252,7 @@ _cygtls::call_signal_handler ()
|
||||
/* Call signal handler. */
|
||||
while (sig)
|
||||
{
|
||||
lock (); unlock (); // make sure synchronized
|
||||
lock ();
|
||||
this_sa_flags = sa_flags;
|
||||
int thissig = sig;
|
||||
|
||||
@ -1261,8 +1260,9 @@ _cygtls::call_signal_handler ()
|
||||
reset_signal_arrived ();
|
||||
sigset_t this_oldmask = set_process_mask_delta ();
|
||||
int this_errno = saved_errno;
|
||||
incyg--;
|
||||
sig = 0;
|
||||
unlock (); // make sure synchronized
|
||||
incyg = 0;
|
||||
if (!(this_sa_flags & SA_SIGINFO))
|
||||
{
|
||||
void (*sigfunc) (int) = func;
|
||||
@ -1275,7 +1275,7 @@ _cygtls::call_signal_handler ()
|
||||
/* no ucontext_t information provided yet */
|
||||
sigact (thissig, &thissi, NULL);
|
||||
}
|
||||
incyg++;
|
||||
incyg = 1;
|
||||
set_signal_mask (this_oldmask, myself->getsigmask ());
|
||||
if (this_errno >= 0)
|
||||
set_errno (this_errno);
|
||||
|
Reference in New Issue
Block a user