* 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:
		| @@ -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; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user