diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index de66583c7..5b0f68de8 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2005-04-01 Christopher Faylor + + * sigproc.cc (create_signal_arrive): New (temporary?) function to + create signal_arrived event. + (sigproc_init): Use create_signal_arrived. + * fork.cc (fork_child): Create signal_arrived early. + 2005-04-01 Corinna Vinschen * fork.cc (fork_child): Fixup SYSV IPC shared memory before fixing diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 4a842131a..a2473ad26 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -156,6 +156,7 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls) { extern void fixup_hooks_after_fork (); extern void fixup_timers_after_fork (); + extern void create_signal_arrived (); debug_printf ("child is running. pid %d, ppid %d, stack here %p", myself->pid, myself->ppid, __builtin_frame_address (0)); @@ -199,6 +200,8 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls) if (fixup_mmaps_after_fork (hParent)) api_fatal ("recreate_mmaps_after_fork_failed"); + create_signal_arrived (); + #ifdef USE_SERVER /* Incredible but true: If we use sockets and SYSV IPC shared memory, there's a good chance that a duplicated socket in the child occupies diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index c85847e10..e17c744dd 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -462,13 +462,23 @@ sig_dispatch_pending (bool fast) (void) sig_send (myself, fast ? __SIGFLUSHFAST : __SIGFLUSH); } +void __stdcall +create_signal_arrived () +{ + if (signal_arrived) + return; + /* local event signaled when main thread has been dispatched + to a signal handler function. */ + signal_arrived = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); + ProtectHandle (signal_arrived); +} + /* Message initialization. Called from dll_crt0_1 - * - * This routine starts the signal handling thread. The wait_sig_inited - * event is used to signal that the thread is ready to handle signals. - * We don't wait for this during initialization but instead detect it - * in sig_send to gain a little concurrency. - */ + + This routine starts the signal handling thread. The wait_sig_inited + event is used to signal that the thread is ready to handle signals. + We don't wait for this during initialization but instead detect it + in sig_send to gain a little concurrency. */ void __stdcall sigproc_init () { @@ -480,10 +490,7 @@ sigproc_init () */ new_muto (sync_proc_subproc); - /* local event signaled when main thread has been dispatched - to a signal handler function. */ - signal_arrived = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - ProtectHandle (signal_arrived); + create_signal_arrived (); hwait_sig = new cygthread (wait_sig, cygself, "sig"); hwait_sig->zap_h ();