Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-10-23 15:30:40 +0300
committerCorinna Vinschen <corinna@vinschen.de>2015-10-23 15:30:40 +0300
commitcf51db8baafb5c642f8c976f479a9af9e6f52fd3 (patch)
tree31f33f83e247d788ec40b2dc34185bae87cf6240
parent505812d04283d9276bb462683bbfaf52b241ac05 (diff)
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>
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/cygtls.cc1
-rw-r--r--winsup/cygwin/cygtls.h1
-rw-r--r--winsup/cygwin/sigproc.cc20
4 files changed, 30 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 15e490211..1f24c390c 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,12 @@
+2015-10-23 Corinna Vinschen <corinna@vinschen.de>
+
+ * 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.
+
2015-10-22 Corinna Vinschen <corinna@vinschen.de>
* common.din (aligned_alloc): Export.
diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc
index cb8c24e8f..c94578ffa 100644
--- a/winsup/cygwin/cygtls.cc
+++ b/winsup/cygwin/cygtls.cc
@@ -187,6 +187,7 @@ _cygtls::remove (DWORD wait)
/* FIXME: Need some sort of atthreadexit function to allow things like
select to control this themselves. */
+ remove_pending_sigs ();
if (signal_arrived)
{
HANDLE h = signal_arrived;
diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h
index c8615af70..b386b989d 100644
--- a/winsup/cygwin/cygtls.h
+++ b/winsup/cygwin/cygtls.h
@@ -267,6 +267,7 @@ public:
void handle_SIGCONT ();
private:
void __reg3 call2 (DWORD (*) (void *, void *), void *, void *);
+ void remove_pending_sigs ();
/*gentls_offsets*/
};
#pragma pack(pop)
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)
{