From 4d5d7a2c0990cb8f2831a4dab6a3c760959e1e78 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sat, 21 Feb 2004 22:57:36 +0000 Subject: [PATCH] * exceptions.cc (sigpacket::process): Make sure that tls is filled in for SIGSTOP condition. (_cygtls::call_signal_handler): Restore signal mask using saved oldmask rather than current oldmask. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/exceptions.cc | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 5bf3ba677..3a2c01b60 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2004-02-21 Christopher Faylor + + * exceptions.cc (sigpacket::process): Make sure that tls is filled in + for SIGSTOP condition. + (_cygtls::call_signal_handler): Restore signal mask using saved oldmask + rather than current oldmask. + 2004-02-20 Christopher Faylor * path.cc (conv_path_list): Return error condition. diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 7bc7c7775..f2aec7731 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -707,7 +707,7 @@ _cygtls::interrupt_setup (int sig, void *handler, myself->process_state |= PID_STOPPED; } - this->sig = sig; // Should ALWAYS be last setting set to avoid a race + this->sig = sig; // Should always be last thing set to avoid a race /* Clear any waiting threads prior to dispatching to handler function */ int res = SetEvent (signal_arrived); // For an EINTR case @@ -955,6 +955,8 @@ sigpacket::process () if ( si.si_signo == SIGSTOP) { sig_clear (SIGCONT); + if (!tls) + tls = _main_tls; goto stop; } @@ -1156,12 +1158,12 @@ _cygtls::call_signal_handler () (void) pop (); reset_signal_arrived (); - sigset_t oldmask = oldmask; + sigset_t this_oldmask = oldmask; int this_errno = saved_errno; set_process_mask (newmask); sig = 0; sigfunc (thissig); - set_process_mask (oldmask); + set_process_mask (this_oldmask); if (this_errno >= 0) set_errno (this_errno); }