diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 2f142c5fe..765e6a2a1 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2003-09-22 Christopher Faylor + + * dcrt0.cc (do_exit): Eliminate "C" linkage. Call events_terminate + early. + (exit_states): Move out of source file into header file. + * winsup.h: Move exit_states here. Remove "C" linkage from do_exit + declaration. + * debug.cc (lock_debug): Remove explicit (and incorrect) external for + exit_state. + * sigproc.cc (sig_dispatch_pending): Don't flush signals if exiting. + 2003-09-20 Christopher Faylor * spawn.cc (pthread_cleanup): New struct. diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index c907399bf..470934a1b 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -956,26 +956,18 @@ __main (void) do_global_ctors (user_data->ctors, FALSE); } -enum exit_states - { - ES_NOT_EXITING = 0, - ES_THREADTERM, - ES_SIGNAL, - ES_CLOSEALL, - ES_SIGPROCTERMINATE, - ES_TITLE, - ES_HUP_PGRP, - ES_HUP_SID, - ES_TTY_TERMINATE, - ES_EVENTS_TERMINATE - }; - exit_states NO_COPY exit_state; extern CRITICAL_SECTION exit_lock; -extern "C" void __stdcall +void __stdcall do_exit (int status) { + if (exit_state < ES_EVENTS_TERMINATE) + { + exit_state = ES_EVENTS_TERMINATE; + events_terminate (); + } + EnterCriticalSection (&exit_lock); UINT n = (UINT) status; @@ -1059,12 +1051,6 @@ do_exit (int status) tty_terminate (); } - if (exit_state < ES_EVENTS_TERMINATE) - { - exit_state = ES_EVENTS_TERMINATE; - events_terminate (); - } - minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n); myself->exit (n); } diff --git a/winsup/cygwin/debug.cc b/winsup/cygwin/debug.cc index 962878471..1b4084feb 100644 --- a/winsup/cygwin/debug.cc +++ b/winsup/cygwin/debug.cc @@ -36,7 +36,6 @@ class lock_debug public: lock_debug () : acquired (0) { - extern int exit_state; if (locker && !exit_state) acquired = !!locker->acquire (INFINITE); } diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 6c5393795..dad5c7f8a 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -557,7 +557,7 @@ sigpending (sigset_t *set) extern "C" int __stdcall sig_dispatch_pending () { - if (!hwait_sig || GetCurrentThreadId () == sigtid) + if (exit_state || !hwait_sig || GetCurrentThreadId () == sigtid) return 0; sigframe thisframe (mainthread); diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 55c0fe8a1..369f3ac85 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -162,7 +162,23 @@ extern "C" int dll_dllcrt0 (HMODULE, per_process *); extern "C" int dll_noncygwin_dllcrt0 (HMODULE, per_process *); /* exit the program */ -extern "C" void __stdcall do_exit (int) __attribute__ ((noreturn)); + +enum exit_states + { + ES_NOT_EXITING = 0, + ES_EVENTS_TERMINATE, + ES_THREADTERM, + ES_SIGNAL, + ES_CLOSEALL, + ES_SIGPROCTERMINATE, + ES_TITLE, + ES_HUP_PGRP, + ES_HUP_SID, + ES_TTY_TERMINATE + }; + +extern exit_states exit_state; +void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn)); /* UID/GID */ void uinfo_init (void);