From 900f20710fb10a9d02248f1a2d442c324d1fa659 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 30 Jul 2009 15:48:51 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/dcrt0.cc | 15 +++++++++------ winsup/cygwin/globals.cc | 1 - 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e8c125c6c..836c23bca 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2009-07-29 Dave Korn + + * 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 * path.h (class path_conv): Convert path from char array to char *. diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 042c1a73b..9cff06f47 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -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; diff --git a/winsup/cygwin/globals.cc b/winsup/cygwin/globals.cc index ccfc20830..b50bf8460 100644 --- a/winsup/cygwin/globals.cc +++ b/winsup/cygwin/globals.cc @@ -30,7 +30,6 @@ enum exit_states { ES_NOT_EXITING = 0, ES_PROCESS_LOCKED, - ES_GLOBAL_DTORS, ES_EVENTS_TERMINATE, ES_THREADTERM, ES_SIGNAL,