summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sigproc.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-10-23 14:30:40 +0200
committerCorinna Vinschen <corinna@vinschen.de>2015-10-23 14:30:40 +0200
commitcf51db8baafb5c642f8c976f479a9af9e6f52fd3 (patch)
tree31f33f83e247d788ec40b2dc34185bae87cf6240 /winsup/cygwin/sigproc.cc
parent505812d04283d9276bb462683bbfaf52b241ac05 (diff)
downloadcygnal-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.cc20
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)
{