* 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.
This commit is contained in:
		| @@ -1,3 +1,14 @@ | ||||
| 2003-09-22  Christopher Faylor  <cgf@redhat.com> | ||||
|  | ||||
| 	* 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  <cgf@redhat.com> | ||||
|  | ||||
| 	* spawn.cc (pthread_cleanup): New struct. | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -36,7 +36,6 @@ class lock_debug | ||||
|  public: | ||||
|   lock_debug () : acquired (0) | ||||
|   { | ||||
|     extern int exit_state; | ||||
|     if (locker && !exit_state) | ||||
|       acquired = !!locker->acquire (INFINITE); | ||||
|   } | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user