aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog15
-rw-r--r--winsup/cygwin/dtable.cc14
-rw-r--r--winsup/cygwin/fhandler_tty.cc13
3 files changed, 32 insertions, 10 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index fc9f1e7..8b178f5 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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>
diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc
index 70e52f4..c6c300b 100644
--- a/winsup/cygwin/dtable.cc
+++ b/winsup/cygwin/dtable.cc
@@ -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);
}
}
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 85a4cc7..60b12a9 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -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
{