OSDN Git Service

* globals.cc (enum exit_states::ES_GLOBAL_DTORS): Delete.
authorcorinna <corinna>
Thu, 30 Jul 2009 15:48:50 +0000 (15:48 +0000)
committercorinna <corinna>
Thu, 30 Jul 2009 15:48:50 +0000 (15:48 +0000)
* 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
winsup/cygwin/dcrt0.cc
winsup/cygwin/globals.cc

index e8c125c..836c23b 100644 (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 *.
index 042c1a7..9cff06f 100644 (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;
index ccfc208..b50bf84 100644 (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,