diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-10-23 14:30:40 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-10-23 14:30:40 +0200 |
commit | cf51db8baafb5c642f8c976f479a9af9e6f52fd3 (patch) | |
tree | 31f33f83e247d788ec40b2dc34185bae87cf6240 /winsup/cygwin/sigproc.cc | |
parent | 505812d04283d9276bb462683bbfaf52b241ac05 (diff) | |
download | cygnal-cf51db8baafb5c642f8c976f479a9af9e6f52fd3.tar.gz cygnal-cf51db8baafb5c642f8c976f479a9af9e6f52fd3.tar.bz2 cygnal-cf51db8baafb5c642f8c976f479a9af9e6f52fd3.zip |
Clear pending signals targeting exiting threadnewlib-snapshot-20151023
* 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>
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r-- | winsup/cygwin/sigproc.cc | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 9f261c9b3..387a71a69 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -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) { |