* sigproc.cc (exit_thread): undef ExitThread or suffer recursion. Attempt to
lock process prior to calling sig_send.
This commit is contained in:
parent
c3a4634985
commit
d3a03427bc
@ -1,3 +1,8 @@
|
||||
2012-12-21 Christopher Faylor <me.cygwin2012@cgf.cx>
|
||||
|
||||
* sigproc.cc (exit_thread): undef ExitThread or suffer recursion.
|
||||
Attempt to lock process prior to calling sig_send.
|
||||
|
||||
2012-12-21 Christopher Faylor <me.cygwin2012@cgf.cx>
|
||||
|
||||
Revert the reversion and go with implementation described in
|
||||
|
@ -561,6 +561,8 @@ exit_thread (DWORD res)
|
||||
{
|
||||
HANDLE h;
|
||||
|
||||
# undef ExitThread
|
||||
|
||||
if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
|
||||
GetCurrentProcess (), &h,
|
||||
0, FALSE, DUPLICATE_SAME_ACCESS))
|
||||
@ -573,11 +575,11 @@ exit_thread (DWORD res)
|
||||
ProtectHandle1 (h, exit_thread);
|
||||
siginfo_t si = {__SIGTHREADEXIT, SI_KERNEL};
|
||||
si.si_value.sival_ptr = h;
|
||||
lock_process for_now; /* May block indefinitely if we're exiting. */
|
||||
/* Tell wait_sig to wait for this thread to exit. It can then release
|
||||
the lock below and close the above-opened handle. */
|
||||
sig_send (myself_nowait, si, &_my_tls);
|
||||
lock_process for_now;
|
||||
ExitThread (0); /* Should never hit this */
|
||||
ExitThread (0); /* Should never hit this */
|
||||
}
|
||||
|
||||
int __stdcall
|
||||
|
@ -48,9 +48,9 @@ class lock_process
|
||||
public:
|
||||
static void init () {locker.init ("lock_process");}
|
||||
void dont_bother () {skip_unlock = true;}
|
||||
lock_process (bool exiting = false)
|
||||
lock_process (bool exiting = false, DWORD howlong = INFINITE)
|
||||
{
|
||||
locker.acquire ();
|
||||
locker.acquire (howlong);
|
||||
skip_unlock = exiting;
|
||||
if (exiting && exit_state < ES_PROCESS_LOCKED)
|
||||
exit_state = ES_PROCESS_LOCKED;
|
||||
|
Loading…
x
Reference in New Issue
Block a user