diff options
author | Christopher Faylor <me@cgf.cx> | 2005-09-13 17:08:54 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-09-13 17:08:54 +0000 |
commit | 67483cb2cdee37aa435fd108cea5310a873925a3 (patch) | |
tree | 4a959e9d5c14f812a42061b608780e84b4371a41 /winsup/cygwin/pinfo.cc | |
parent | 00fb79f70e0ef973da36b26ada9ca13daad81c4b (diff) | |
download | cygnal-67483cb2cdee37aa435fd108cea5310a873925a3.tar.gz cygnal-67483cb2cdee37aa435fd108cea5310a873925a3.tar.bz2 cygnal-67483cb2cdee37aa435fd108cea5310a873925a3.zip |
* dcrt0.cc (do_exit): Rely on sigproc_terminate to set exit_state
appropriately.
* pinfo.cc (pinfo::exit): Always call sigproc_terminate here. Rely on
sigproc_terminate to signal signal thread to handle eventual process exit.
* sigproc.cc (no_signals_available): Change criteria for determining if this
process can handle signals to itself.
(my_sendsig): New variable. Copy of my sendsig handle.
(proc_can_be_signalled): Don't send signals if exit code is set.
(sigproc_terminate): Use and set exit_state appropriately to determine when to
do anything. Send __SIGEXIT to self to control process exit.
(sig_send): Use my_sendsig for sending signals. Don't call
proc_can_be_signalled for myself since the criteria is now different for
sending signals to myself.
(wait_sig): Copy myself->sendsig to my_sendsig for future use. Exit signal
loop when __SIGEXIT is received. Wait for main thread to exit and use its exit
status to actually exit process.
* sigproc.h (__SIGEXIT): New enum.
* dcrt0.cc (alloc_stack): Eliminate superfluous "return;".
* debug.cc (add_handle): Ditto.
* devices.in (device::parse): Ditto.
* dtable.cc (dtable::vfork_parent_restore): Ditto.
(dtable::vfork_child_fixup): Ditto.
* environ.cc (parse_options): Ditto.
* errno.cc (seterrno_from_win_error): Ditto.
* exceptions.cc (sig_handle_tty_stop): Ditto.
(set_signal_mask): Ditto.
* fhandler.cc (fhandler_base::read): Ditto.
(fhandler_base::operator delete): Ditto.
(fhandler_base::seekdir): Ditto.
(fhandler_base::rewinddir): Ditto.
* fhandler_console.cc (fhandler_console::read): Ditto.
(fhandler_console::fixup_after_exec): Ditto.
* sigproc.cc (sigproc_init): Ditto.
(sigproc_terminate): Ditto.
* devices.cc: Regenerate.
Diffstat (limited to 'winsup/cygwin/pinfo.cc')
-rw-r--r-- | winsup/cygwin/pinfo.cc | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 0e89ca03b..9ce988db7 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -136,13 +136,12 @@ pinfo::zap_cwd () void pinfo::exit (DWORD n) { + sigproc_terminate (); exit_state = ES_FINAL; + cygthread::terminate (); if (n != EXITCODE_NOSET) - { - sigproc_terminate (); /* Just terminate signal and process stuff */ - self->exitcode = EXITCODE_SET | n;/* We're really exiting. Record the UNIX exit code. */ - } + self->exitcode = EXITCODE_SET | n;/* We're really exiting. Record the UNIX exit code. */ /* FIXME: There is a potential race between an execed process and its parent here. I hated to add a mutex just for this, though. */ @@ -161,12 +160,25 @@ pinfo::exit (DWORD n) int exitcode = self->exitcode & 0xffff; if (!self->cygstarted) exitcode >>= 8; - release (); _my_tls.stacklock = 0; _my_tls.stackptr = _my_tls.stack; - sigproc_printf ("Calling ExitProcess hProcess %p, n %p, exitcode %p", + if (&_my_tls == _main_tls) + { + sigproc_printf ("Calling ExitProcess hProcess %p, n %p, exitcode %p", + hProcess, n, exitcode); + ExitThread (exitcode); + } + else if (hMainThread) + { + sigproc_printf ("Calling TerminateThread since %p != %p, %p, n %p, exitcode %p", + &_my_tls, _main_tls, hProcess, n, exitcode); + TerminateThread (hMainThread, exitcode); + } + + sigproc_printf ("Calling ExitProcess since hMainthread is 0, hProcess %p, n %p, exitcode %p", hProcess, n, exitcode); + release (); ExitProcess (exitcode); } # undef self |