Clear pending signals targeting exiting thread
* cygtls.cc (_cygtls::remove): Call remove_pending_sigs. * cygtls.h (_cygtls::remove_pending_sigs): Declare. * sigproc.cc (pending_signals::clear): Define new method taking a _cygtls pointer argument. Drop pending signals for that thread. (_cygtls::remove_pending_sigs): Call pending_signals::clear for this thread. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
@ -79,7 +79,8 @@ public:
|
||||
void add (sigpacket&);
|
||||
bool pending () {retry = true; return !!start.next;}
|
||||
void clear (int sig) {sigs[sig].si.si_signo = 0;}
|
||||
friend void __reg1 sig_dispatch_pending (bool);;
|
||||
void clear (_cygtls *tls);
|
||||
friend void __reg1 sig_dispatch_pending (bool);
|
||||
friend void WINAPI wait_sig (VOID *arg);
|
||||
friend void sigproc_init ();
|
||||
};
|
||||
@ -397,6 +398,23 @@ sig_clear (int sig)
|
||||
sigq.clear (sig);
|
||||
}
|
||||
|
||||
/* Clear pending signals of specific thread. Called from
|
||||
_cygtls::remove_pending_sigs. */
|
||||
void
|
||||
pending_signals::clear (_cygtls *tls)
|
||||
{
|
||||
for (int sig = 0; sig < NSIG + 1; ++sig)
|
||||
if (sigs[sig].sigtls == tls)
|
||||
clear (sig);
|
||||
}
|
||||
|
||||
/* Clear pending signals of specific thread. Called from _cygtls::remove */
|
||||
void
|
||||
_cygtls::remove_pending_sigs ()
|
||||
{
|
||||
sigq.clear (this);
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
sigpending (sigset_t *mask)
|
||||
{
|
||||
|
Reference in New Issue
Block a user