This is the mail archive of the cygwin-patches mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 1/2] Cygwin: fork: Always pause child after fixups.

Pause the child process after performing fork fixups even if there were
no dynamically loaded dlls with extra data/bss transfers to wait for.
This allows the parent process to cancel the current fork call even if
the child process was successfully initialized already.

This is a preparation for when the parent does remember the child no
earlier than after successful child initialization.
 winsup/cygwin/ | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/winsup/cygwin/ b/winsup/cygwin/
index 7e1c08990..59b13806c 100644
--- a/winsup/cygwin/
+++ b/winsup/cygwin/
@@ -180,13 +180,10 @@ frok::child (volatile char * volatile here)
   cygheap->fdtab.fixup_after_fork (hParent);
-  /* If we haven't dynamically loaded any dlls, just signal the parent.
-     Otherwise, tell the parent that we've loaded all the dlls
-     and wait for the parent to fill in the loaded dlls' data/bss. */
-  if (!load_dlls)
-    sync_with_parent ("performed fork fixup", false);
-  else
-    sync_with_parent ("loaded dlls", true);
+  /* Signal that we have successfully initialized, so the parent can
+     - transfer data/bss for dynamically loaded dlls (if any), or
+     - terminate the current fork call even if the child is initialized. */
+  sync_with_parent ("performed fork fixups and dynamic dll loading", true);
   init_console_handler (myself->ctty > 0);
   ForceCloseHandle1 (fork_info->forker_finished, forker_finished);
@@ -477,7 +474,8 @@ frok::parent (volatile char * volatile stack_here)
-  /* Start thread, and then wait for it to reload dlls.  */
+  /* Start the child up, and then wait for it to
+     perform fork fixups and dynamic dll loading (if any). */
   resume_child (forker_finished);
   if (!ch.sync (child->pid, hchild, FORK_WAIT_TIMEOUT))
@@ -508,10 +506,11 @@ frok::parent (volatile char * volatile stack_here)
 	      goto cleanup;
-      /* Start the child up again. */
-      resume_child (forker_finished);
+  /* Finally start the child up. */
+  resume_child (forker_finished);
   ForceCloseHandle (forker_finished);
   forker_finished = NULL;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]