OSDN Git Service

* dtable.cc (dtable::delete_archetype): Add debugging.
authorcgf <cgf>
Fri, 12 Dec 2003 20:46:02 +0000 (20:46 +0000)
committercgf <cgf>
Fri, 12 Dec 2003 20:46:02 +0000 (20:46 +0000)
(dtable::release): Move archetype deletion here.
(dtable::vfork_child_dup): Increment ctty usecount to catch later
close_all_files case in parent/child.
(dtable::vfork_child_fixup): Avoid using cygheap->foo where this should really
be using local references.  Call close on archetyped handles since the handles
haven't had the noninherit flag set.
* fhandler_tty.cc (fhandler_tty_slave::close): Remove archetype deletion code.
Add defensive error message when DEBUGGING.
(fhandler_tty_common::set_close_on_exec): Use more robust method for checking
whether to set handles into noninherit if there is an archetype associated with
the fhandler.

winsup/cygwin/ChangeLog
winsup/cygwin/dtable.cc
winsup/cygwin/fhandler_tty.cc

index fc9f1e7..8b178f5 100644 (file)
@@ -1,5 +1,20 @@
 2003-12-12  Christopher Faylor  <cgf@redhat.com>
 
+       * dtable.cc (dtable::delete_archetype): Add debugging.
+       (dtable::release): Move archetype deletion here.
+       (dtable::vfork_child_dup): Increment ctty usecount to catch later
+       close_all_files case in parent/child.
+       (dtable::vfork_child_fixup): Avoid using cygheap->foo where this should
+       really be using local references.  Call close on archetyped handles
+       since the handles haven't had the noninherit flag set.
+       * fhandler_tty.cc (fhandler_tty_slave::close): Remove archetype
+       deletion code.  Add defensive error message when DEBUGGING.
+       (fhandler_tty_common::set_close_on_exec): Use more robust method for
+       checking whether to set handles into noninherit if there is an
+       archetype associated with the fhandler.
+
+2003-12-12  Christopher Faylor  <cgf@redhat.com>
+
        * dcrt0.cc (alloc_stack): Move _main_tls if stack is relocated.
 
 2003-12-11  Christopher Faylor  <cgf@redhat.com>
index 70e52f4..c6c300b 100644 (file)
@@ -188,6 +188,7 @@ dtable::delete_archetype (fhandler_base *fh)
   for (unsigned i = 0; i < narchetypes; i++)
     if (fh == archetypes[i])
       {
+       debug_printf ("deleting archive element %d for %s", i, fh->get_name ());
        if (i < --farchetype)
          archetypes[i] = archetypes[farchetype];
        break;
@@ -218,7 +219,10 @@ dtable::release (int fd)
     {
       if (fds[fd]->need_fixup_before ())
        dec_need_fixup_before ();
+      fhandler_base *arch = fds[fd]->archetype;
       delete fds[fd];
+      if (arch && !arch->usecount)
+       cygheap->fdtab.delete_archetype (arch);
       fds[fd] = NULL;
     }
 }
@@ -697,6 +701,8 @@ dtable::vfork_child_dup ()
 
   /* Remove impersonation */
   cygheap->user.deimpersonate ();
+  if (cygheap->ctty)
+    cygheap->ctty->usecount++;
 
   for (size_t i = 0; i < size; i++)
     if (not_open (i))
@@ -746,16 +752,16 @@ dtable::vfork_child_fixup ()
   fds = fds_on_hold;
 
   fhandler_base *fh;
-  for (int i = 0; i < (int) cygheap->fdtab.size; i++)
-    if ((fh = cygheap->fdtab[i]) != NULL)
+  for (int i = 0; i < (int) size; i++)
+    if ((fh = fds[i]) != NULL)
       {
        fh->clear_readahead ();
-       if (fh->get_close_on_exec ())
+       if (!fh->archetype && fh->get_close_on_exec ())
          release (i);
        else
          {
            fh->close ();
-           cygheap->fdtab.release (i);
+           release (i);
          }
       }
 
index 85a4cc7..60b12a9 100644 (file)
@@ -616,15 +616,16 @@ fhandler_tty_slave::close ()
                  fhandler_console::open_fhs, archetype->usecount);
   if (--archetype->usecount)
     {
+#ifdef DEBUGGING
+      if (archetype->usecount < 0)
+       system_printf ("usecount %d", archetype->usecount);
+#endif
       termios_printf ("just exiting because archetype usecount is > 0");
       return 0;
     }
 
   termios_printf ("closing last open %s handle", pc.dev.name);
-  fhandler_tty_slave *arch = (fhandler_tty_slave *) archetype;
-  int res = fhandler_tty_common::close ();
-  cygheap->fdtab.delete_archetype (arch);
-  return res;
+  return fhandler_tty_common::close ();
 }
 
 int
@@ -910,7 +911,7 @@ fhandler_tty_slave::dup (fhandler_base *child)
   fhandler_console::open_fhs++;
   fhandler_tty_slave *arch = (fhandler_tty_slave *) archetype;
   *(fhandler_tty_slave *) child = *arch;
-  archetype->usecount++;
+  arch->usecount++;
   child->usecount = 0;
   myself->set_ctty (get_ttyp (), openflags, arch);
   termios_printf ("incremented open_fhs %d, archetype usecount %d",
@@ -1331,7 +1332,7 @@ fhandler_pty_master::ptsname ()
 void
 fhandler_tty_common::set_close_on_exec (int val)
 {
-  if (get_major () == DEV_TTYS_MAJOR)
+  if (archetype)
     set_close_on_exec_flag (val);
   else
     {