During fork, the child process requires the process table to be
initialized for fixup_shms_after_fork, while still allowing subsequent
dlls.load_after_fork to fail silently (for when the "forkable" hardlinks
are not created yet).
pinfo::remember not performing reattach anymore requires explicit
pinfo::reattach now where appropriate.
Prepares to improve "Cygwin: fork: Remember child not before success."
commit
f03ea8e1c57bd5cea83f6cd47fa02870bdfeb1c5, which leads to fork
problems if cygserver is running:
https://cygwin.com/ml/cygwin-patches/2019-q2/msg00155.html
this_errno = EAGAIN;
#ifdef DEBUGGING0
error ("child remember failed");
+#endif
+ goto cleanup;
+ }
+ if (!child.reattach ())
+ {
+ this_errno = EAGAIN;
+#ifdef DEBUGGING0
+ error ("child reattach failed");
#endif
goto cleanup;
}
vchild->process_state |= PID_INITIALIZING;
vchild->ppid = what == PROC_DETACHED_CHILD ? 1 : myself->pid; /* always set last */
}
- if (what == PROC_DETACHED_CHILD)
- break;
- /* fall through intentionally */
+ break;
case PROC_REATTACH_CHILD:
procs[nprocs] = vchild;
child_info_spawn::wait_for_myself ()
{
postfork (myself);
- myself.remember (false);
+ if (myself.remember (false))
+ myself.reattach ();
WaitForSingleObject (ev, INFINITE);
}
child->start_time = time (NULL); /* Register child's starting time. */
child->nice = myself->nice;
postfork (child);
- if (!child.remember (mode == _P_DETACH))
+ if (mode == _P_DETACH
+ ? !child.remember (true)
+ : !(child.remember (false) && child.reattach ()))
{
/* FIXME: Child in strange state now */
CloseHandle (pi.hProcess);