summaryrefslogtreecommitdiffstats
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/dcrt0.cc1
-rw-r--r--winsup/cygwin/dll_init.cc2
-rw-r--r--winsup/cygwin/dll_init.h1
4 files changed, 11 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index e90724529..32e9590b2 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,12 @@
+2008-08-04 Christopher Faylor <me+cygwin@cgf.cx>
+
+ Changes suggested by Dave Korn.
+ * dcrt0.cc (cygwin_exit): Remove (hopefully) extraneous call to
+ dll_global_dtors.
+ * dll_init.cc (dll_global_dtors): Run destructors in reverse
+ dependency/load order.
+ * dll_init.h (dll_list): Add dll_global_dtors as a friend.
+
2008-08-01 Christopher Faylor <me+cygwin@cgf.cx>
* dcrt0.cc (dll_crt0_1): Add a symbol denoting return from call to
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index e37cbec9b..dbdc61e2c 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -1112,7 +1112,6 @@ cygwin_atexit (void (*function)(void))
extern "C" void
cygwin_exit (int n)
{
- dll_global_dtors ();
if (atexit_lock)
atexit_lock.acquire ();
exit (n);
diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
index 22c64e1e2..9a867b5d8 100644
--- a/winsup/cygwin/dll_init.cc
+++ b/winsup/cygwin/dll_init.cc
@@ -32,7 +32,7 @@ dll_global_dtors ()
int recorded = dll_global_dtors_recorded;
dll_global_dtors_recorded = false;
if (recorded)
- for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ())
+ for (dll *d = dlls.end; d != &dlls.start; d = d->prev)
d->p.run_dtors ();
}
diff --git a/winsup/cygwin/dll_init.h b/winsup/cygwin/dll_init.h
index 205123a2f..a7601e78b 100644
--- a/winsup/cygwin/dll_init.h
+++ b/winsup/cygwin/dll_init.h
@@ -86,6 +86,7 @@ public:
hold = &start;
return inext ();
}
+ friend void dll_global_dtors ();
};
extern dll_list dlls;