OSDN Git Service

* child_info.h (CURR_CHILD_INFO_MAGIC): Reset.
authorcgf <cgf>
Wed, 16 Nov 2011 04:09:30 +0000 (04:09 +0000)
committercgf <cgf>
Wed, 16 Nov 2011 04:09:30 +0000 (04:09 +0000)
(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
winsup/cygwin/child_info.h
winsup/cygwin/dcrt0.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/spawn.cc

index 917bf25..89a485b 100644 (file)
@@ -1,3 +1,27 @@
+2011-11-15  Christopher Faylor  <me.cygwin2011@cgf.cx>
+
+       * 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  <me.cygwin2011@cgf.cx>
 
        * pinfo.cc (_pinfo::dup_proc_pipe): Fatalize a warning when debugging.
index 8fc0178..d69d441 100644 (file)
@@ -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 () {};
index 6ae8b75..62105ab 100644 (file)
@@ -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. */
index b596456..663abfb 100644 (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++)
     {
@@ -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)
index b250db1..25072a8 100644 (file)
@@ -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.  */