summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>2019-07-31 12:35:31 +0200
committerCorinna Vinschen <corinna-cygwin@cygwin.com>2019-07-31 13:27:47 +0200
commit23a779bf3d7c2afc9eab88f6b8727c1db5544547 (patch)
tree959b61750d0f6bcd7bfc410c2d39d0852d0e5119
parent6661a67747c14cfa7ac91458914037ee296fcd1e (diff)
downloadcygnal-23a779bf3d7c2afc9eab88f6b8727c1db5544547.tar.gz
cygnal-23a779bf3d7c2afc9eab88f6b8727c1db5544547.tar.bz2
cygnal-23a779bf3d7c2afc9eab88f6b8727c1db5544547.zip
Cygwin: pinfo: stop remember doing reattach
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
-rw-r--r--winsup/cygwin/fork.cc8
-rw-r--r--winsup/cygwin/sigproc.cc7
-rw-r--r--winsup/cygwin/spawn.cc4
3 files changed, 14 insertions, 5 deletions
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
index 59b13806c..0119581df 100644
--- a/winsup/cygwin/fork.cc
+++ b/winsup/cygwin/fork.cc
@@ -424,6 +424,14 @@ frok::parent (volatile char * volatile stack_here)
#endif
goto cleanup;
}
+ if (!child.reattach ())
+ {
+ this_errno = EAGAIN;
+#ifdef DEBUGGING0
+ error ("child reattach failed");
+#endif
+ goto cleanup;
+ }
/* CHILD IS STOPPED */
debug_printf ("child is alive (but stopped)");
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 900facd58..8003e2db6 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -216,9 +216,7 @@ proc_subproc (DWORD what, uintptr_t val)
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;
@@ -873,7 +871,8 @@ void
child_info_spawn::wait_for_myself ()
{
postfork (myself);
- myself.remember (false);
+ if (myself.remember (false))
+ myself.reattach ();
WaitForSingleObject (ev, INFINITE);
}
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 579b3c9c3..7f7af4449 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -779,7 +779,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
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);