* cygtls.h (struct _cygtls::thread_handle): Remove/revert.

* sigproc.h (struct sipacket::thread_handle): Put thread_handle here.
* sigproc.cc (sigproc_terminate): Move setting of thread_handle...
(sig_send): ...to here.  Put it in packet being sent.  Only close pack.wakeup
when we're waiting for completion.
(wait_sig): Use thread_handle directly from received packet.
This commit is contained in:
Christopher Faylor 2005-09-23 15:18:22 +00:00
parent e7a76793ad
commit 255e7e559e
4 changed files with 23 additions and 17 deletions

View File

@ -1,3 +1,12 @@
2005-09-23 Christopher Faylor <cgf@timesys.com>
* cygtls.h (struct _cygtls::thread_handle): Remove/revert.
* sigproc.h (struct sipacket::thread_handle): Put thread_handle here.
* sigproc.cc (sigproc_terminate): Move setting of thread_handle...
(sig_send): ...to here. Put it in packet being sent. Only close
pack.wakeup when we're waiting for completion.
(wait_sig): Use thread_handle directly from received packet.
2005-09-22 Christopher Faylor <cgf@timesys.com> 2005-09-22 Christopher Faylor <cgf@timesys.com>
* cygheap.cc (cygheap_fixup_in_child): It's not just for exec. * cygheap.cc (cygheap_fixup_in_child): It's not just for exec.

View File

@ -184,7 +184,6 @@ struct _cygtls
class cygthread *_ctinfo; class cygthread *_ctinfo;
san andreas; san andreas;
waitq wq; waitq wq;
HANDLE thread_handle;
struct _cygtls *prev, *next; struct _cygtls *prev, *next;
__stack_t *stackptr; __stack_t *stackptr;
int sig; int sig;

View File

@ -500,11 +500,6 @@ sigproc_terminate (exit_states es)
siginfo_t si; siginfo_t si;
memset (&si, 0, sizeof (si)); memset (&si, 0, sizeof (si));
si.si_signo = __SIGEXIT; 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); sig_send (myself_nowait, si, &_my_tls);
proc_terminate (); // clean up process stuff proc_terminate (); // clean up process stuff
} }
@ -626,7 +621,15 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
pack.si.si_uid = myself->uid; pack.si.si_uid = myself->uid;
pack.pid = myself->pid; pack.pid = myself->pid;
pack.tls = (_cygtls *) tls; pack.tls = (_cygtls *) tls;
if (wait_for_completion) if (si.si_signo == __SIGEXIT)
{
if (&_my_tls == _main_tls)
pack.thread_handle = hMainThread;
else
DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc, &pack.thread_handle, 0,
FALSE, DUPLICATE_SAME_ACCESS);
}
else if (wait_for_completion)
{ {
pack.wakeup = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); pack.wakeup = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
sigproc_printf ("wakeup %p", pack.wakeup); sigproc_printf ("wakeup %p", pack.wakeup);
@ -667,6 +670,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
{ {
sigproc_printf ("Waiting for pack.wakeup %p", pack.wakeup); sigproc_printf ("Waiting for pack.wakeup %p", pack.wakeup);
rc = WaitForSingleObject (pack.wakeup, WSSC); rc = WaitForSingleObject (pack.wakeup, WSSC);
ForceCloseHandle (pack.wakeup);
} }
else else
{ {
@ -677,12 +681,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
ForceCloseHandle (sendsig); ForceCloseHandle (sendsig);
} }
if (pack.wakeup) pack.wakeup = NULL;
{
ForceCloseHandle (pack.wakeup);
pack.wakeup = NULL;
}
if (rc == WAIT_OBJECT_0) if (rc == WAIT_OBJECT_0)
rc = 0; // Successful exit rc = 0; // Successful exit
else else
@ -1124,11 +1123,9 @@ wait_sig (VOID *self)
} }
my_sendsig = NULL; my_sendsig = NULL;
if (!pack.tls) HANDLE& h = pack.thread_handle;
api_fatal ("no exit packet received"); if (!h)
if (!pack.tls->thread_handle)
api_fatal ("no thread handle set on exit"); api_fatal ("no thread handle set on exit");
HANDLE h = pack.tls->thread_handle;
DWORD res = WaitForSingleObject (h, INFINITE); DWORD res = WaitForSingleObject (h, INFINITE);
DWORD exitcode = 1; DWORD exitcode = 1;

View File

@ -47,6 +47,7 @@ struct sigpacket
union union
{ {
HANDLE wakeup; HANDLE wakeup;
HANDLE thread_handle;
struct sigpacket *next; struct sigpacket *next;
}; };
int __stdcall process () __attribute__ ((regparm (1))); int __stdcall process () __attribute__ ((regparm (1)));