]> sourceware.org Git - newlib-cygwin.git/commitdiff
Fix incorrect implementation to clear per-thread pending signals
authorCorinna Vinschen <corinna@vinschen.de>
Mon, 2 Nov 2015 12:53:25 +0000 (13:53 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Mon, 2 Nov 2015 12:54:30 +0000 (13:54 +0100)
* sigproc.cc (class pending_signals): Drop sigproc_init friendship.
(pending_signals::clear): Fix implementation to avoid subsequent
endless loop in wait_sig.  Improve comment.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
winsup/cygwin/ChangeLog
winsup/cygwin/sigproc.cc

index 9dfa1b37858f45466f374be0ad2d545e25a48275..179eb24eab9c617c48388dc5aa8a070e40adb42d 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-02  Corinna Vinschen  <corinna@vinschen.de>
+
+       * sigproc.cc (class pending_signals): Drop sigproc_init friendship.
+       (pending_signals::clear): Fix implementation to avoid subsequent
+       endless loop in wait_sig.  Improve comment.
+
 2015-11-02  Corinna Vinschen  <corinna@vinschen.de>
 
        * mount.h (enum fs_info_type): Add prlfs (Parallels Desktop FS).
index 387a71a69d126dd39cddf3735129d27f4c0dd5c1..fbc738d4f85f7bd9fb374461bbd12fbeb5442586 100644 (file)
@@ -82,7 +82,6 @@ public:
   void clear (_cygtls *tls);
   friend void __reg1 sig_dispatch_pending (bool);
   friend void WINAPI wait_sig (VOID *arg);
-  friend void sigproc_init ();
 };
 
 Static pending_signals sigq;
@@ -398,14 +397,21 @@ sig_clear (int sig)
   sigq.clear (sig);
 }
 
-/* Clear pending signals of specific thread.  Called from
+/* Clear pending signals of specific thread.  Called under TLS lock 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);
+  sigpacket *q = &start, *qnext;
+
+  while ((qnext = q->next))
+    {
+      if (qnext->sigtls == tls)
+       {
+         q->next = qnext->next;
+         qnext->si.si_signo = 0;
+       }
+    }
 }
 
 /* Clear pending signals of specific thread.  Called from _cygtls::remove */
This page took 0.036234 seconds and 5 git commands to generate.