From 7b2740dda35981d44331c77354b6d9c3d05b1338 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 16 Nov 2011 04:09:33 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 24 ++++++++++++++++++++++++ winsup/cygwin/child_info.h | 9 ++++++--- winsup/cygwin/dcrt0.cc | 3 +-- winsup/cygwin/sigproc.cc | 35 +++++++++++++++++++++++++++-------- winsup/cygwin/spawn.cc | 3 +-- 5 files changed, 59 insertions(+), 15 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 917bf256d..89a485b30 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,27 @@ +2011-11-15 Christopher Faylor + + * 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. + 2011-11-14 Christopher Faylor * pinfo.cc (_pinfo::dup_proc_pipe): Fatalize a warning when debugging. diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index 8fc0178d3..d69d44166 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -35,7 +35,7 @@ enum child_status #define EXEC_MAGIC_SIZE sizeof(child_info) /* Change this value if you get a message indicating that it is out-of-sync. */ -#define CURR_CHILD_INFO_MAGIC 0x941e0a4aU +#define CURR_CHILD_INFO_MAGIC 0x24f4be4bU #define NPROCS 256 @@ -111,6 +111,11 @@ public: int envc; char **envp; HANDLE myself_pinfo; + int nchildren; + cchildren children[0]; + static cygheap_exec_info *alloc (); + void record_children (); + void reattach_children (HANDLE); }; class child_info_spawn: public child_info @@ -123,8 +128,6 @@ public: int __stdin; int __stdout; char filler[4]; - int nchildren; - cchildren children[NPROCS]; void cleanup (); child_info_spawn () {}; diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 6ae8b7576..62105ab61 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -411,8 +411,7 @@ child_info_fork::alloc_stack_hard_way (volatile char *b) stack_ptr = VirtualAlloc (stacktop, stacksize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!stack_ptr) - api_fatal ("fork: can't commit memory for stack %p(%d), %E", - stacktop, stacksize); + abort ("can't commit memory for stack %p(%d), %E", stacktop, stacksize); if (guardsize != (size_t) -1) { /* Allocate PAGE_GUARD page if it still fits. */ 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++) { @@ -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) { diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index b250db19f..25072a886 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -354,8 +354,7 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, else chtype = _CH_EXEC; - moreinfo = (cygheap_exec_info *) ccalloc_abort (HEAP_1_EXEC, 1, - sizeof (cygheap_exec_info)); + moreinfo = cygheap_exec_info::alloc (); /* CreateProcess takes one long string that is the command line (sigh). We need to quote any argument that has whitespace or embedded "'s. */