summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/fork.cc3
-rw-r--r--winsup/cygwin/sigproc.cc27
3 files changed, 27 insertions, 10 deletions
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 <cgf@timesys.com>
+
+ * 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 <corinna@vinschen.de>
* 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 ();