* 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.
This commit is contained in:
Christopher Faylor
2005-04-14 17:34:03 +00:00
parent 3178cfffc8
commit dda0657380
10 changed files with 62 additions and 18 deletions

View File

@@ -129,9 +129,11 @@ char title_buf[TITLESIZE + 1];
static void
do_global_dtors (void)
{
if (user_data->dtors)
dll_global_dtors ();
void (**pfunc) () = user_data->dtors;
if (pfunc)
{
void (**pfunc)() = user_data->dtors;
user_data->dtors = NULL;
while (*++pfunc)
(*pfunc) ();
}
@@ -972,7 +974,6 @@ extern "C" void
__main (void)
{
do_global_ctors (user_data->ctors, false);
atexit (do_global_dtors);
}
exit_states NO_COPY exit_state;
@@ -994,6 +995,8 @@ do_exit (int status)
EnterCriticalSection (&exit_lock);
muto::set_exiting_thread ();
do_global_dtors ();
if (exit_state < ES_EVENTS_TERMINATE)
{
exit_state = ES_EVENTS_TERMINATE;
@@ -1096,6 +1099,7 @@ cygwin_atexit (void (*function)(void))
extern "C" void
cygwin_exit (int n)
{
do_global_dtors ();
if (atexit_lock)
atexit_lock.acquire ();
exit (n);