* 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:
parent
9c0d960d7f
commit
9bc36097c9
@ -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>
|
2004-12-22 Christopher Faylor <cgf@timesys.com>
|
||||||
|
|
||||||
* cygthread.h (cygthread::release): Just declare here.
|
* cygthread.h (cygthread::release): Just declare here.
|
||||||
|
@ -226,18 +226,33 @@ cygthread::release ()
|
|||||||
void
|
void
|
||||||
cygthread::terminate_thread ()
|
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)
|
if (!is_freerange)
|
||||||
{
|
{
|
||||||
ResetEvent (*this);
|
ResetEvent (*this);
|
||||||
ResetEvent (thread_sync);
|
ResetEvent (thread_sync);
|
||||||
}
|
}
|
||||||
|
if (!h)
|
||||||
|
return;
|
||||||
(void) TerminateThread (h, 0);
|
(void) TerminateThread (h, 0);
|
||||||
(void) WaitForSingleObject (h, INFINITE);
|
(void) WaitForSingleObject (h, INFINITE);
|
||||||
|
if (!h)
|
||||||
|
return;
|
||||||
|
|
||||||
CloseHandle (h);
|
CloseHandle (h);
|
||||||
|
|
||||||
while (!stack_ptr)
|
while (h && !stack_ptr)
|
||||||
low_priority_sleep (0);
|
low_priority_sleep (0);
|
||||||
|
|
||||||
|
if (!h)
|
||||||
|
return;
|
||||||
|
|
||||||
MEMORY_BASIC_INFORMATION m;
|
MEMORY_BASIC_INFORMATION m;
|
||||||
memset (&m, 0, sizeof (m));
|
memset (&m, 0, sizeof (m));
|
||||||
(void) VirtualQuery (stack_ptr, &m, sizeof m);
|
(void) VirtualQuery (stack_ptr, &m, sizeof m);
|
||||||
|
@ -763,6 +763,7 @@ proc_waiter (void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sigproc_printf ("exiting wait thread for pid %d", pid);
|
sigproc_printf ("exiting wait thread for pid %d", pid);
|
||||||
|
vchild.wait_thread = NULL;
|
||||||
_my_tls._ctinfo->release (); /* return the cygthread to the cygthread pool */
|
_my_tls._ctinfo->release (); /* return the cygthread to the cygthread pool */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user