summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sigproc.cc
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-09-23 03:35:41 +0000
committerChristopher Faylor <me@cgf.cx>2005-09-23 03:35:41 +0000
commit936e4018b6fd1ad21ac528cf567fa81a46b054b0 (patch)
tree006c51049b5d80576f8dba9cfc0e7bb71d65db4f /winsup/cygwin/sigproc.cc
parent4340c43955131ac445d4d6e9b5fee36b1168ed9c (diff)
downloadcygnal-936e4018b6fd1ad21ac528cf567fa81a46b054b0.tar.gz
cygnal-936e4018b6fd1ad21ac528cf567fa81a46b054b0.tar.bz2
cygnal-936e4018b6fd1ad21ac528cf567fa81a46b054b0.zip
* cygheap.cc (cygheap_fixup_in_child): It's not just for exec.
* cygtls.h (struct _cygtls::thread_handle): New field. * dcrt0.cc (exit_lock): Remove declaration. * winsup.h (exit_lock): Add declaration. * exceptions.cc (sigpacket::process): Properly return after signal_exit. * pinfo.cc (pinfo::exit): Only exit the process if _my_tls.thread_handle has not been filled out -- which should be an impossible event. * sigproc.cc (sigproc_terminate): Fillout _my_tls.thread_handle to provide something for wait_sig to wait for. Use the siginfo_t version of sig_send and fill out the tls argument with _my_tls. (wait_sig): Wait for the thread specified in pack.tls or (for now) complain bitterly if it doesn't exit.
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r--winsup/cygwin/sigproc.cc23
1 files changed, 18 insertions, 5 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index b9c66f376..8d84551eb 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -497,7 +497,15 @@ sigproc_terminate (exit_states es)
else
{
sigproc_printf ("entering");
- sig_send (myself_nowait, __SIGEXIT);
+ siginfo_t si;
+ memset (&si, 0, sizeof (si));
+ si.si_signo = __SIGEXIT;
+ if (&_my_tls == _main_tls)
+ _my_tls.thread_handle = hMainThread;
+ else
+ DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc, &_my_tls.thread_handle, 0,
+ FALSE, DUPLICATE_SAME_ACCESS);
+ sig_send (myself_nowait, si, &_my_tls);
proc_terminate (); // clean up process stuff
}
}
@@ -1005,10 +1013,11 @@ wait_sig (VOID *self)
debug_printf ("entering ReadFile loop, readsig %p, myself->sendsig %p",
readsig, myself->sendsig);
+ sigpacket pack;
for (;;)
{
DWORD nb;
- sigpacket pack;
+ pack.tls = NULL;
if (!ReadFile (readsig, &pack, sizeof (pack), &nb, NULL))
break;
@@ -1114,9 +1123,13 @@ wait_sig (VOID *self)
break;
}
- HANDLE h = hMainThread;
- my_sendsig = hMainThread = NULL;
- DWORD res = !h ? WAIT_OBJECT_0 : WaitForSingleObject (h, INFINITE);
+ my_sendsig = NULL;
+ if (!pack.tls)
+ api_fatal ("no exit packet received");
+ if (!pack.tls->thread_handle)
+ api_fatal ("no thread handle set on exit");
+ HANDLE h = pack.tls->thread_handle;
+ DWORD res = WaitForSingleObject (h, INFINITE);
DWORD exitcode = 1;