OSDN Git Service

* cygthread.cc (cygthread::stub): Reintroduce clearing of __name but do it
authorcgf <cgf>
Mon, 14 Oct 2002 03:51:44 +0000 (03:51 +0000)
committercgf <cgf>
Mon, 14 Oct 2002 03:51:44 +0000 (03:51 +0000)
before SetEvent to eliminate a race.
(cygthread::terminate): Accumulate list of threads to check for termination and
call WaitForMultipleObjects on list rather than waiting for each thread
individually.
* sigproc.cc (subproc_init): Zap hwait_subproc thread handle since it is no
longer used.
* spawn.cc (spawn_guts): Fix so that cygthread::terminate is *really* called
only for exec.

winsup/cygwin/ChangeLog
winsup/cygwin/cygthread.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/spawn.cc

index 8eb5d93..f9c2b89 100644 (file)
@@ -1,5 +1,20 @@
 2002-10-13  Christopher Faylor  <cgf@redhat.com>
 
+       * cygthread.cc (cygthread::stub): Reintroduce clearing of __name but do
+       it before SetEvent to eliminate a race.
+       (cygthread::terminate): Accumulate list of threads to check for
+       termination and call WaitForMultipleObjects on list rather than waiting
+       for each thread individually.
+       * sigproc.cc (subproc_init): Zap hwait_subproc thread handle since it
+       is no longer used.
+
+2002-10-13  Christopher Faylor  <cgf@redhat.com>
+
+       * spawn.cc (spawn_guts): Fix so that cygthread::terminate is *really*
+       called only for exec.
+
+2002-10-13  Christopher Faylor  <cgf@redhat.com>
+
        * cygthread.cc (cygthread::stub): Don't zero __name here.  That
        introduces a race.
 
index ce64a74..d4295e6 100644 (file)
@@ -58,6 +58,7 @@ cygthread::stub (VOID *arg)
 #ifdef DEBUGGING
          info->func = NULL;    // catch erroneous activation
 #endif
+         info->__name = NULL;
          SetEvent (info->ev);
        }
       switch (WaitForSingleObject (info->thread_sync, INFINITE))
@@ -313,15 +314,19 @@ cygthread::terminate ()
       (void) TerminateThread (runner_handle, 0);
       (void) WaitForSingleObject (runner_handle, INFINITE);
       (void) CloseHandle (runner_handle);
+      HANDLE hthreads[NTHREADS];
+      int n = 0;
       for (unsigned i = 0; i < NTHREADS; i++)
        if (threads[i].h)
          {
+           hthreads[n++] = threads[i].h;
            TerminateThread (threads[i].h, 0);
-           (void) WaitForSingleObject (threads[i].h, INFINITE);
-           (void) CloseHandle (threads[i].h);
-#ifdef DEBUGGING
-           threads[i].h = NULL;
-#endif
          }
+      if (n)
+       {
+         (void) WaitForMultipleObjects (n, hthreads, TRUE, INFINITE);
+         while (--n >= 0)
+           CloseHandle (hthreads[n]);
+       }
     }
 }
index db5626b..863a22d 100644 (file)
@@ -805,8 +805,9 @@ subproc_init (void)
    */
   events[0] = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
   hwait_subproc = new cygthread (wait_subproc, NULL, "proc");
+  hwait_subproc->zap_h ();
   ProtectHandle (events[0]);
-  sigproc_printf ("started wait_subproc thread %p", (HANDLE) *hwait_subproc);
+  sigproc_printf ("started wait_subproc thread");
 }
 
 /* Initialize some of the memory block passed to child processes
index b3bf304..6bc76fb 100644 (file)
@@ -715,8 +715,10 @@ spawn_guts (const char * prog_arg, const char *const *argv,
       cygheap->fdtab.fixup_before_exec (pi.dwProcessId);
       cygheap_setup_for_child_cleanup (newheap, &ciresrv, 1);
       if (mode == _P_OVERLAY)
-       ResumeThread (pi.hThread);
-      cygthread::terminate ();
+       {
+         ResumeThread (pi.hThread);
+         cygthread::terminate ();
+       }
     }
 
   if (mode != _P_OVERLAY)