Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-04-14 21:34:03 +0400
committerChristopher Faylor <me@cgf.cx>2005-04-14 21:34:03 +0400
commitdda0657380d0383935d80bf62a3d305df849bb6f (patch)
tree1598f34f2910c0f0132a9c9ccb7ca641fd830efb /winsup/cygwin/dll_init.cc
parent3178cfffc8348e980cc1a5c05089b4109dfc8717 (diff)
* dcrt0.cc (do_global_dtors): Run DLL dtors.
(__main): Don't rely on atexit to run dtors. (do_exit): Specifically call do_global_dtors here. (cygwin_exit): Ditto. * dll_init.cc (dll_global_dtors): Make global. Only run dtors once. (dll_list::init): Just set flag that dtors should be run. Don't rely on atexit. * dll_init.h (dll_global_dtors): Declare. * exceptions.cc (sigrelse): Define. * path.h (is_fs_device): New method. (is_lnk_special): Ditto. * fhandler_disk_file.cc (fhandler_disk_file::link): Use "is_lnk_special" rather than "is_lnk_symlink". * syscalls.cc (rename): Ditto. * hookapi.cc (ld_preload): Use colon as a separator rather than space.
Diffstat (limited to 'winsup/cygwin/dll_init.cc')
-rw-r--r--winsup/cygwin/dll_init.cc18
1 files changed, 8 insertions, 10 deletions
diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
index 4c3d9a26c..b3949062c 100644
--- a/winsup/cygwin/dll_init.cc
+++ b/winsup/cygwin/dll_init.cc
@@ -24,14 +24,17 @@ extern void __stdcall check_sanity_and_sync (per_process *);
dll_list NO_COPY dlls;
static int NO_COPY in_forkee;
-static int dll_global_dtors_recorded;
+static bool dll_global_dtors_recorded;
/* Run destructors for all DLLs on exit. */
-static void
+void
dll_global_dtors ()
{
- for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ())
- d->p.run_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 ())
+ d->p.run_dtors ();
}
/* Run all constructors associated with a dll */
@@ -215,12 +218,7 @@ dll_list::detach (void *retaddr)
void
dll_list::init ()
{
- /* Make sure that destructors are called on exit. */
- if (!dll_global_dtors_recorded)
- {
- atexit (dll_global_dtors);
- dll_global_dtors_recorded = 1;
- }
+ dll_global_dtors_recorded = true;
/* Walk the dll chain, initializing each dll */
dll *d = &start;