* 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. * spawn.cc (spawn_guts): Fix so that cygthread::terminate is *really* called only for exec.
This commit is contained in:
parent
a7a5d0ba37
commit
969203ce91
@ -1,3 +1,18 @@
|
|||||||
|
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>
|
2002-10-13 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* cygthread.cc (cygthread::stub): Don't zero __name here. That
|
* cygthread.cc (cygthread::stub): Don't zero __name here. That
|
||||||
|
@ -58,6 +58,7 @@ cygthread::stub (VOID *arg)
|
|||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
info->func = NULL; // catch erroneous activation
|
info->func = NULL; // catch erroneous activation
|
||||||
#endif
|
#endif
|
||||||
|
info->__name = NULL;
|
||||||
SetEvent (info->ev);
|
SetEvent (info->ev);
|
||||||
}
|
}
|
||||||
switch (WaitForSingleObject (info->thread_sync, INFINITE))
|
switch (WaitForSingleObject (info->thread_sync, INFINITE))
|
||||||
@ -313,15 +314,19 @@ cygthread::terminate ()
|
|||||||
(void) TerminateThread (runner_handle, 0);
|
(void) TerminateThread (runner_handle, 0);
|
||||||
(void) WaitForSingleObject (runner_handle, INFINITE);
|
(void) WaitForSingleObject (runner_handle, INFINITE);
|
||||||
(void) CloseHandle (runner_handle);
|
(void) CloseHandle (runner_handle);
|
||||||
|
HANDLE hthreads[NTHREADS];
|
||||||
|
int n = 0;
|
||||||
for (unsigned i = 0; i < NTHREADS; i++)
|
for (unsigned i = 0; i < NTHREADS; i++)
|
||||||
if (threads[i].h)
|
if (threads[i].h)
|
||||||
{
|
{
|
||||||
|
hthreads[n++] = threads[i].h;
|
||||||
TerminateThread (threads[i].h, 0);
|
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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -805,8 +805,9 @@ subproc_init (void)
|
|||||||
*/
|
*/
|
||||||
events[0] = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
|
events[0] = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
|
||||||
hwait_subproc = new cygthread (wait_subproc, NULL, "proc");
|
hwait_subproc = new cygthread (wait_subproc, NULL, "proc");
|
||||||
|
hwait_subproc->zap_h ();
|
||||||
ProtectHandle (events[0]);
|
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
|
/* Initialize some of the memory block passed to child processes
|
||||||
|
@ -715,8 +715,10 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
|||||||
cygheap->fdtab.fixup_before_exec (pi.dwProcessId);
|
cygheap->fdtab.fixup_before_exec (pi.dwProcessId);
|
||||||
cygheap_setup_for_child_cleanup (newheap, &ciresrv, 1);
|
cygheap_setup_for_child_cleanup (newheap, &ciresrv, 1);
|
||||||
if (mode == _P_OVERLAY)
|
if (mode == _P_OVERLAY)
|
||||||
ResumeThread (pi.hThread);
|
{
|
||||||
cygthread::terminate ();
|
ResumeThread (pi.hThread);
|
||||||
|
cygthread::terminate ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode != _P_OVERLAY)
|
if (mode != _P_OVERLAY)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user