diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 6173ac601..ae7b6b575 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2002-07-09 Christopher Faylor + + * debug.cc: Avoid explicit zeroing of globals. + (lock_debug): Make locker a static member. Avoid unlocking when + already unlocked (from Conrad Scott). + (debug_init): Initialize lock_debug::locker here. + * fork.cc (fork_child): Fix up fdtab earlier to avoid some (but not + all) confusion with close-on-exec craziness. + 2002-07-05 Corinna Vinschen * fhandler.h (fhandler_socket::is_unconnected): Constify. diff --git a/winsup/cygwin/debug.cc b/winsup/cygwin/debug.cc index a530c5c34..dc786ff69 100644 --- a/winsup/cygwin/debug.cc +++ b/winsup/cygwin/debug.cc @@ -176,27 +176,45 @@ typedef struct _h struct _h *next; } handle_list; -static NO_COPY handle_list starth = {0, NULL, NULL, NULL, 0, 0, NULL}; -static NO_COPY handle_list *endh = NULL; +static NO_COPY handle_list starth; +static NO_COPY handle_list *endh; -static handle_list NO_COPY freeh[1000] = {{0, NULL, NULL, NULL, 0, 0, NULL}}; +static NO_COPY handle_list freeh[1000]; #define NFREEH (sizeof (freeh) / sizeof (freeh[0])) -static muto NO_COPY *debug_lock = NULL; +void debug_init (); -struct lock_debug +class lock_debug { - lock_debug () {if (debug_lock) debug_lock->acquire (INFINITE);} - void unlock () {if (debug_lock) debug_lock->release ();} + static muto *locker; + bool acquired; + public: + lock_debug () : acquired (0) + { + if (locker) + acquired = !!locker->acquire (INFINITE); + } + void unlock () + { + if (locker && acquired) + { + locker->release (); + acquired = false; + } + } ~lock_debug () {unlock ();} + friend void debug_init (); }; +muto NO_COPY *lock_debug::locker = NULL; + static bool __stdcall mark_closed (const char *, int, HANDLE, const char *, BOOL); void debug_init () { - new_muto (debug_lock); + muto *debug_lock_muto; + lock_debug::locker = new_muto (debug_lock_muto); } /* Find a registered handle in the linked list of handles. */ @@ -296,6 +314,7 @@ delete_handle (handle_list *hl) void debug_fixup_after_fork () { + /* No lock needed at this point */ handle_list *hl; for (hl = &starth; hl->next != NULL; hl = hl->next) if (hl->next->clexec_pid) diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index e6fb91037..e25bc478c 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -243,7 +243,6 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls) } sync_with_parent ("after longjmp.", TRUE); - ProtectHandle (hParent); sigproc_printf ("hParent %p, child 1 first_dll %p, load_dlls %d\n", hParent, first_dll, load_dlls); @@ -275,9 +274,11 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls) MALLOC_CHECK; + cygheap->fdtab.fixup_after_fork (hParent); + ProtectHandle (hParent); + debug_fixup_after_fork (); pinfo_fixup_after_fork (); - cygheap->fdtab.fixup_after_fork (hParent); signal_fixup_after_fork (); MALLOC_CHECK;