* 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.
This commit is contained in:
Christopher Faylor
2011-11-16 04:09:33 +00:00
parent f32d96ff99
commit 7b2740dda3
5 changed files with 59 additions and 15 deletions

View File

@@ -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++)
{
@@ -908,6 +921,12 @@ child_info_spawn::reattach_children ()
}
}
void
child_info_spawn::reattach_children ()
{
moreinfo->reattach_children (parent);
}
void
child_info::ready (bool execed)
{