* 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:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user