* globals.cc (enum exit_states::ES_GLOBAL_DTORS): Delete.

* dcrt0.cc (__main): Schedule dll_global_dtors to run
	atexit before global dtors.
	(do_exit): Delete test for ES_GLOBAL_DTORS and call to
	dll_global_dtors.
This commit is contained in:
Corinna Vinschen 2009-07-30 15:48:51 +00:00
parent 0986989f6a
commit 900f20710f
3 changed files with 17 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2009-07-29 Dave Korn <dave.korn.cygwin@googlemail.com>
* globals.cc (enum exit_states::ES_GLOBAL_DTORS): Delete.
* dcrt0.cc (__main): Schedule dll_global_dtors to run
atexit before global dtors.
(do_exit): Delete test for ES_GLOBAL_DTORS and call to
dll_global_dtors.
2009-07-29 Corinna Vinschen <corinna@vinschen.de>
* path.h (class path_conv): Convert path from char array to char *.

View File

@ -993,8 +993,17 @@ cygwin_dll_init ()
extern "C" void
__main (void)
{
/* Ordering is critical here. DLL ctors have already been
run as they were being loaded, so we should stack the
queued call to DLL dtors now. */
atexit (dll_global_dtors);
do_global_ctors (user_data->ctors, false);
/* Now we have run global ctors, register their dtors. */
atexit (do_global_dtors);
/* At exit, global dtors will run first, so the app can still
use shared library functions while terminating; then the
DLLs will be destroyed; finally newlib will shut down stdio
and terminate itself. */
}
void __stdcall
@ -1013,12 +1022,6 @@ do_exit (int status)
lock_process until_exit (true);
if (exit_state < ES_GLOBAL_DTORS)
{
exit_state = ES_GLOBAL_DTORS;
dll_global_dtors ();
}
if (exit_state < ES_EVENTS_TERMINATE)
{
exit_state = ES_EVENTS_TERMINATE;

View File

@ -30,7 +30,6 @@ enum exit_states
{
ES_NOT_EXITING = 0,
ES_PROCESS_LOCKED,
ES_GLOBAL_DTORS,
ES_EVENTS_TERMINATE,
ES_THREADTERM,
ES_SIGNAL,