diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c21b2b6ff..1da5f3c98 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,20 @@ +2002-08-11 Christopher Faylor + + * assert.cc (__assert): Call debugger on assertion failure if + debugging. + * dcrt0.cc (dll_crt0_1): Just wait for signal thread to go live rather + than going through the overhead of invoking it. + * fork.cc (fork_child): Ditto. + * exceptions.cc (signal_fixup_after_fork): Call sigproc_init here. + * sigproc.cc (proc_can_be_signalled): Assume that the signal thread is + live. + (sig_dispatch): Ditto. + (sig_send): Ditto. + (wait_for_sigthread): Renamed from "wait_for_me". Assume that + wait_sig_inited has been set and that this function is only called from + the main thread. + * winsup.h (wait_for_sigthread): Declare new function. + 2002-08-08 Christopher Faylor * environ.cc (parse_options): Remember the "no" part of any options for diff --git a/winsup/cygwin/assert.cc b/winsup/cygwin/assert.cc index 4c5a3b08f..fbce8753e 100644 --- a/winsup/cygwin/assert.cc +++ b/winsup/cygwin/assert.cc @@ -46,6 +46,9 @@ __assert (const char *file, int line, const char *failedexpr) failedexpr, file, line); } +#ifdef DEBUGGING + try_to_debug (); +#endif abort (); // FIXME: Someday this should work. /* NOTREACHED */ diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 8d4d72dd7..05f8239be 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -774,7 +774,7 @@ dll_crt0_1 () /* Flush signals and ensure that signal thread is up and running. Can't do this for noncygwin case since the signal thread is blocked due to LoadLibrary serialization. */ - sig_send (NULL, __SIGFLUSH); + wait_for_sigthread (); set_errno (0); diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index f907b21a4..9e2e631ec 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -715,15 +715,16 @@ interrupt_now (CONTEXT *ctx, int sig, void *handler, struct sigaction& siga) void __stdcall signal_fixup_after_fork () { - if (!sigsave.sig) - return; - - sigsave.sig = 0; - if (sigsave.retaddr_on_stack) + if (sigsave.sig) { - *sigsave.retaddr_on_stack = sigsave.retaddr; - set_process_mask (sigsave.oldmask); + sigsave.sig = 0; + if (sigsave.retaddr_on_stack) + { + *sigsave.retaddr_on_stack = sigsave.retaddr; + set_process_mask (sigsave.oldmask); + } } + sigproc_init (); } void __stdcall diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 7486da098..d1b7fa9a7 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -313,8 +313,7 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls) user_data->threadinterface->fixup_after_fork (); - /* Initialize signal/process handling */ - sigproc_init (); + wait_for_sigthread (); __pthread_atforkchild (); cygbench ("fork-child"); return 0; diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 4914e6a24..49c8bda57 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -17,6 +17,7 @@ details. */ #include #include #include +#include #include "cygerrno.h" #include "sync.h" #include "sigproc.h" @@ -167,19 +168,13 @@ out: return res; } -__inline static void -wait_for_me () +void __stdcall +wait_for_sigthread () { - /* See if this is the first signal call after initialization. - * If so, wait for notification that all initialization has completed. - * Then set the handle to NULL to avoid checking this again. - */ - if (wait_sig_inited) - { - (void) WaitForSingleObject (wait_sig_inited, INFINITE); - (void) ForceCloseHandle (wait_sig_inited); - wait_sig_inited = NULL; - } + assert (wait_sig_inited); + (void) WaitForSingleObject (wait_sig_inited, INFINITE); + (void) ForceCloseHandle (wait_sig_inited); + wait_sig_inited = NULL; } /* Get the sync_proc_subproc muto to control access to @@ -210,7 +205,7 @@ proc_can_be_signalled (_pinfo *p) { if (p == myself_nowait || p == myself_nowait_nonmain || p == myself) { - wait_for_me (); + assert (!wait_sig_inited); return 1; } @@ -535,7 +530,7 @@ sig_dispatch_pending (int justwake) #endif else { - wait_for_me (); + assert (!wait_sig_inited); if (!justwake) (void) sig_send (myself, __SIGFLUSH); else if (ReleaseSemaphore (sigcatch_nosync, 1, NULL)) @@ -657,7 +652,7 @@ sig_send (_pinfo *p, int sig, DWORD ebp, bool exception) { if (no_signals_available ()) goto out; // Either exiting or not yet initializing - wait_for_me (); + assert (!wait_sig_inited); wait_for_completion = p != myself_nowait; p = myself; } diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index 0960efae2..36babecff 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -118,6 +118,7 @@ int __stdcall sig_send (_pinfo *, int, DWORD ebp = (DWORD) __builtin_frame_addre bool exception = 0) __attribute__ ((regparm(3))); void __stdcall signal_fixup_after_fork (); void __stdcall signal_fixup_after_exec (bool); +void __stdcall wait_for_sigthread (); extern char myself_nowait_dummy[]; extern char myself_nowait_nonmain_dummy[];