OSDN Git Service

* sigproc.cc (remove_proc): Don't do busy loop when execing since thread could
authorcgf <cgf>
Mon, 21 Nov 2011 19:13:29 +0000 (19:13 +0000)
committercgf <cgf>
Mon, 21 Nov 2011 19:13:29 +0000 (19:13 +0000)
have been terminated prior to setting flag.
* signal.cc (sigwaitinfo): Zero event before closing to signal other threads
that it is no longer available.

winsup/cygwin/ChangeLog
winsup/cygwin/signal.cc
winsup/cygwin/sigproc.cc

index f9505df..e7278c8 100644 (file)
@@ -1,3 +1,11 @@
+2011-11-21  Christopher Faylor  <me.cygwin2011@cgf.cx>
+
+       * sigproc.cc (remove_proc): Don't do busy loop when execing since
+       thread could have been terminated prior to setting flag.
+
+       * signal.cc (sigwaitinfo): Zero event before closing to signal other
+       threads that it is no longer available.
+
 2011-11-18  Corinna Vinschen  <corinna@vinschen.de>
 
        * shared.cc (get_shared_parent_dir): Use global shared_parent_dir
index 32cbfe9..9b45fee 100644 (file)
@@ -608,6 +608,8 @@ sigwaitinfo (const sigset_t *set, siginfo_t *info)
       __seterrno ();
       res = -1;
     }
+
+  _my_tls.event = NULL;
   CloseHandle (h);
   sigproc_printf ("returning signal %d", res);
   return res;
index 663abfb..a48bd43 100644 (file)
@@ -1106,8 +1106,9 @@ remove_proc (int ci)
         moving it or it may become confused.  The chances are very high that
         the proc_waiter thread has already done this by the time we
         get here.  */
-      while (!procs[nprocs].waiter_ready)
-       yield ();
+      if (!have_execed)
+       while (!procs[nprocs].waiter_ready)
+         yield ();
       procs[ci] = procs[nprocs];
     }
   return 0;