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.
This commit is contained in:
parent
070227ad98
commit
d44daedd9f
|
@ -180,13 +180,10 @@ frok::child (volatile char * volatile here)
|
||||||
|
|
||||||
cygheap->fdtab.fixup_after_fork (hParent);
|
cygheap->fdtab.fixup_after_fork (hParent);
|
||||||
|
|
||||||
/* If we haven't dynamically loaded any dlls, just signal the parent.
|
/* Signal that we have successfully initialized, so the parent can
|
||||||
Otherwise, tell the parent that we've loaded all the dlls
|
- transfer data/bss for dynamically loaded dlls (if any), or
|
||||||
and wait for the parent to fill in the loaded dlls' data/bss. */
|
- terminate the current fork call even if the child is initialized. */
|
||||||
if (!load_dlls)
|
sync_with_parent ("performed fork fixups and dynamic dll loading", true);
|
||||||
sync_with_parent ("performed fork fixup", false);
|
|
||||||
else
|
|
||||||
sync_with_parent ("loaded dlls", true);
|
|
||||||
|
|
||||||
init_console_handler (myself->ctty > 0);
|
init_console_handler (myself->ctty > 0);
|
||||||
ForceCloseHandle1 (fork_info->forker_finished, forker_finished);
|
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);
|
resume_child (forker_finished);
|
||||||
if (!ch.sync (child->pid, hchild, FORK_WAIT_TIMEOUT))
|
if (!ch.sync (child->pid, hchild, FORK_WAIT_TIMEOUT))
|
||||||
{
|
{
|
||||||
|
@ -508,10 +506,11 @@ frok::parent (volatile char * volatile stack_here)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Start the child up again. */
|
|
||||||
resume_child (forker_finished);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Finally start the child up. */
|
||||||
|
resume_child (forker_finished);
|
||||||
|
|
||||||
ForceCloseHandle (forker_finished);
|
ForceCloseHandle (forker_finished);
|
||||||
forker_finished = NULL;
|
forker_finished = NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue