Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2011-11-16 08:09:33 +0400
committerChristopher Faylor <me@cgf.cx>2011-11-16 08:09:33 +0400
commit7b2740dda35981d44331c77354b6d9c3d05b1338 (patch)
tree6c3b23fb5be144d578cd137f49859b26a1d57665 /winsup/cygwin/sigproc.cc
parentf32d96ff9927f60980c14c1bb2d5525d8d683583 (diff)
* child_info.h (CURR_CHILD_INFO_MAGIC): Reset.
(cygheap_exec_info::nchildren): Move from child_info_spawn. (cygheap_exec_info::cchildren): Ditto. (cygheap_exec_info::record_children): Declare new function. (cygheap_exec_info::reattach_children): Ditto. (cygheap_exec_info::alloc): Ditto. (child_info_spawn::nchildren): Move to cygheap_exec_info. (child_info_spawn::cchildren): Ditto. * sigproc.cc (cygheap_exec_info::alloc): Define new function. (child_info_spawn::cleanup): Accommodate move of children info to cygheap_exec_info. (cygheap_exec_info::record_children): Define new function. (cygheap_exec_info::reattach_children): Ditto. (child_info_spawn::record_children): Use cygheap_exec_info function to accomplish this task. (child_info_spawn::reattach_children): Ditto. * spawn.cc (child_info_spawn::worker): Allocate moreinfo using cygheap_exec_info::alloc. * dcrt0.cc (child_info_fork::alloc_stack_hard_way): Use abort for the error to avoid a retry.
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r--winsup/cygwin/sigproc.cc35
1 files changed, 27 insertions, 8 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index b59645628..663abfb5c 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -843,6 +843,14 @@ child_info_spawn::child_info_spawn (child_info_types chtype, bool need_subproc_r
}
}
+cygheap_exec_info *
+cygheap_exec_info::alloc ()
+{
+ return (cygheap_exec_info *) ccalloc_abort (HEAP_1_EXEC, 1,
+ sizeof (cygheap_exec_info)
+ + (nprocs * sizeof (children[0])));
+}
+
void
child_info_spawn::cleanup ()
{
@@ -859,7 +867,6 @@ child_info_spawn::cleanup ()
cfree (moreinfo);
}
moreinfo = NULL;
- nchildren = 0;
if (ev)
{
CloseHandle (ev);
@@ -877,22 +884,28 @@ child_info_spawn::cleanup ()
/* Record any non-reaped subprocesses to be passed to about-to-be-execed
process. FIXME: There is a race here if the process exits while we
are recording it. */
+inline void
+cygheap_exec_info::record_children ()
+{
+ for (nchildren = 0; nchildren < nprocs; nchildren++)
+ {
+ children[nchildren].pid = procs[nchildren]->pid;
+ children[nchildren].p = procs[nchildren];
+ }
+}
+
void
child_info_spawn::record_children ()
{
if (type == _CH_EXEC && iscygwin ())
- for (nchildren = 0; nchildren < nprocs; nchildren++)
- {
- children[nchildren].pid = procs[nchildren]->pid;
- children[nchildren].p = procs[nchildren];
- }
+ moreinfo->record_children ();
}
/* Reattach non-reaped subprocesses passed in from the cygwin process
which previously operated under this pid. FIXME: Is there a race here
if the process exits during cygwin's exec handoff? */
-void
-child_info_spawn::reattach_children ()
+inline void
+cygheap_exec_info::reattach_children (HANDLE parent)
{
for (int i = 0; i < nchildren; i++)
{
@@ -909,6 +922,12 @@ child_info_spawn::reattach_children ()
}
void
+child_info_spawn::reattach_children ()
+{
+ moreinfo->reattach_children (parent);
+}
+
+void
child_info::ready (bool execed)
{
if (!subproc_ready)