diff options
author | Christopher Faylor <me@cgf.cx> | 2011-11-16 08:09:33 +0400 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2011-11-16 08:09:33 +0400 |
commit | 7b2740dda35981d44331c77354b6d9c3d05b1338 (patch) | |
tree | 6c3b23fb5be144d578cd137f49859b26a1d57665 /winsup/cygwin/sigproc.cc | |
parent | f32d96ff9927f60980c14c1bb2d5525d8d683583 (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.cc | 35 |
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) |