* pinfo.cc (proc_waiter): Zero wait_thread in child to avoid races with process

termination.
* cygthread.cc (cygthread::terminate): Clumsily detect when h has gone away and
attempt no further action.
This commit is contained in:
Christopher Faylor 2004-12-22 16:59:03 +00:00
parent 9c0d960d7f
commit 9bc36097c9
3 changed files with 24 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2004-12-22 Christopher Faylor <cgf@timesys.com>
* pinfo.cc (proc_waiter): Zero wait_thread in child to avoid races with
process termination.
* cygthread.cc (cygthread::terminate): Clumsily detect when h has gone away
and attempt no further action.
2004-12-22 Christopher Faylor <cgf@timesys.com>
* cygthread.h (cygthread::release): Just declare here.

View File

@ -226,18 +226,33 @@ cygthread::release ()
void
cygthread::terminate_thread ()
{
/* FIXME: The if (!h) stuff below should be handled better. The
problem is that terminate_thread could be called while a thread
is terminating and either the thread could be handling its own
release or, if this is being called during exit, some other
thread may be attempting to free up this resource. In the former
case, setting some kind of "I deal with my own exit" type of
flag may be the way to handle this. */
if (!is_freerange)
{
ResetEvent (*this);
ResetEvent (thread_sync);
}
if (!h)
return;
(void) TerminateThread (h, 0);
(void) WaitForSingleObject (h, INFINITE);
if (!h)
return;
CloseHandle (h);
while (!stack_ptr)
while (h && !stack_ptr)
low_priority_sleep (0);
if (!h)
return;
MEMORY_BASIC_INFORMATION m;
memset (&m, 0, sizeof (m));
(void) VirtualQuery (stack_ptr, &m, sizeof m);

View File

@ -763,6 +763,7 @@ proc_waiter (void *arg)
}
sigproc_printf ("exiting wait thread for pid %d", pid);
vchild.wait_thread = NULL;
_my_tls._ctinfo->release (); /* return the cygthread to the cygthread pool */
return 0;
}