]> sourceware.org Git - newlib-cygwin.git/commitdiff
Clear pending signals targeting exiting thread newlib-snapshot-20151023
authorCorinna Vinschen <corinna@vinschen.de>
Fri, 23 Oct 2015 12:30:40 +0000 (14:30 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Fri, 23 Oct 2015 12:30:40 +0000 (14:30 +0200)
* 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>
winsup/cygwin/ChangeLog
winsup/cygwin/cygtls.cc
winsup/cygwin/cygtls.h
winsup/cygwin/sigproc.cc

index 15e4902118a5dfb781fa17b2ab83b23c7b08657b..1f24c390c695e994ad9d85eebbaa6125bc6f2940 100644 (file)
@@ -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.
index cb8c24e8fd286a312701a9e545e47f78fee162b2..c94578ffaacf1848709efa18e70e6524c80c6a81 100644 (file)
@@ -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;
index c8615af7085d71e620625952474b53999ee810f8..b386b989dc29b0d1c5ac424f81d7064f1eaeddf4 100644 (file)
@@ -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)
index 9f261c9b35ec62bde98d4251aa5534bc2d2a4ea0..387a71a69d126dd39cddf3735129d27f4c0dd5c1 100644 (file)
@@ -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)
 {
This page took 0.038302 seconds and 5 git commands to generate.