OSDN Git Service

* cygtls.cc (_cygtls::remove): Call remove_wq to ensure that wait stuff is
authorcgf <cgf>
Sun, 14 Mar 2004 06:34:04 +0000 (06:34 +0000)
committercgf <cgf>
Sun, 14 Mar 2004 06:34:04 +0000 (06:34 +0000)
removed from proc_subproc linked list.
* cygtls.h (_cygtls::remove_wq): Declare.
* sigproc.cc (_cygtls::remove_wq): Define.
(proc_subproc): Label event handle appropriately.
* spawn.cc (spawn_guts): Return -1 when wait() fails for spawn types that
require waiting.

winsup/cygwin/ChangeLog
winsup/cygwin/cygtls.cc
winsup/cygwin/cygtls.h
winsup/cygwin/sigproc.cc
winsup/cygwin/spawn.cc

index e3e4253..42bcc14 100644 (file)
@@ -1,3 +1,13 @@
+2004-03-14  Christopher Faylor  <cgf@redhat.com>
+
+       * cygtls.cc (_cygtls::remove): Call remove_wq to ensure that wait stuff
+       is removed from proc_subproc linked list.
+       * cygtls.h (_cygtls::remove_wq): Declare.
+       * sigproc.cc (_cygtls::remove_wq): Define.
+       (proc_subproc): Label event handle appropriately.
+       * spawn.cc (spawn_guts): Return -1 when wait() fails for spawn types
+       that require waiting.
+
 2004-03-12  Corinna Vinschen  <corinna@vinschen.de>
 
        * errno.cc (errmap): Handle ERROR_BUS_RESET.
index 36aaa86..f9770bb 100644 (file)
@@ -159,6 +159,7 @@ _cygtls::remove (DWORD wait)
            if (i < --nthreads)
              cygheap->threadlist[i] = cygheap->threadlist[nthreads];
            debug_printf ("removed %p element %d", this, i);
+           remove_wq ();
            break;
          }
     }
index 1a9e75f..df4b62b 100644 (file)
@@ -154,6 +154,7 @@ struct _cygtls
   void set_threadkill () {threadkill = true;}
   void reset_threadkill () {threadkill = false;}
   int call_signal_handler () __attribute__ ((regparm (1)));
+  void remove_wq () __attribute__ ((regparm (1)));
   void fixup_after_fork () __attribute__ ((regparm (1)));
   void lock () __attribute__ ((regparm (1)));
   void unlock () __attribute__ ((regparm (1)));
index 9c3b200..30318a7 100644 (file)
@@ -401,7 +401,7 @@ proc_subproc (DWORD what, DWORD val)
        {
          wval->ev = wval->thread_ev = CreateEvent (&sec_none_nih, TRUE,
                                                    FALSE, NULL);
-         ProtectHandle (wval->ev);
+         ProtectHandle1 (wval->ev, wq_ev);
        }
 
       ResetEvent (wval->ev);
@@ -469,6 +469,21 @@ out1:
   return rc;
 }
 
+// FIXME: This is inelegant
+void
+_cygtls::remove_wq ()
+{
+  sync_proc_subproc->acquire ();
+  for (waitq *w = &waitq_head; w->next != NULL; w = w->next)
+    if (w->next == &wq)
+      {
+       ForceCloseHandle1 (wq.thread_ev, wq_ev);
+       w->next = wq.next;
+       break;
+      }
+  sync_proc_subproc->release ();
+}
+
 /* Terminate the wait_subproc thread.
  * Called on process exit.
  * Also called by spawn_guts to disassociate any subprocesses from this
index 992bad1..e7d25e9 100644 (file)
@@ -912,7 +912,8 @@ spawn_guts (const char * prog_arg, const char *const *argv,
       break;
     case _P_WAIT:
     case _P_SYSTEM:
-      waitpid (cygpid, (int *) &res, 0);
+      if (waitpid (cygpid, (int *) &res, 0) != cygpid)
+       res = -1;
       break;
     case _P_DETACH:
       res = 0; /* Lose all memory of this child. */