diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 7e1c08990..59b13806c 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -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;