* 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.
This commit is contained in:
Christopher Faylor 2003-12-12 20:46:03 +00:00
parent fac0681d6c
commit 9279515ae1
3 changed files with 32 additions and 10 deletions

View File

@ -1,3 +1,18 @@
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> 2003-12-12 Christopher Faylor <cgf@redhat.com>
* dcrt0.cc (alloc_stack): Move _main_tls if stack is relocated. * dcrt0.cc (alloc_stack): Move _main_tls if stack is relocated.

View File

@ -188,6 +188,7 @@ dtable::delete_archetype (fhandler_base *fh)
for (unsigned i = 0; i < narchetypes; i++) for (unsigned i = 0; i < narchetypes; i++)
if (fh == archetypes[i]) if (fh == archetypes[i])
{ {
debug_printf ("deleting archive element %d for %s", i, fh->get_name ());
if (i < --farchetype) if (i < --farchetype)
archetypes[i] = archetypes[farchetype]; archetypes[i] = archetypes[farchetype];
break; break;
@ -218,7 +219,10 @@ dtable::release (int fd)
{ {
if (fds[fd]->need_fixup_before ()) if (fds[fd]->need_fixup_before ())
dec_need_fixup_before (); dec_need_fixup_before ();
fhandler_base *arch = fds[fd]->archetype;
delete fds[fd]; delete fds[fd];
if (arch && !arch->usecount)
cygheap->fdtab.delete_archetype (arch);
fds[fd] = NULL; fds[fd] = NULL;
} }
} }
@ -697,6 +701,8 @@ dtable::vfork_child_dup ()
/* Remove impersonation */ /* Remove impersonation */
cygheap->user.deimpersonate (); cygheap->user.deimpersonate ();
if (cygheap->ctty)
cygheap->ctty->usecount++;
for (size_t i = 0; i < size; i++) for (size_t i = 0; i < size; i++)
if (not_open (i)) if (not_open (i))
@ -746,16 +752,16 @@ dtable::vfork_child_fixup ()
fds = fds_on_hold; fds = fds_on_hold;
fhandler_base *fh; fhandler_base *fh;
for (int i = 0; i < (int) cygheap->fdtab.size; i++) for (int i = 0; i < (int) size; i++)
if ((fh = cygheap->fdtab[i]) != NULL) if ((fh = fds[i]) != NULL)
{ {
fh->clear_readahead (); fh->clear_readahead ();
if (fh->get_close_on_exec ()) if (!fh->archetype && fh->get_close_on_exec ())
release (i); release (i);
else else
{ {
fh->close (); fh->close ();
cygheap->fdtab.release (i); release (i);
} }
} }

View File

@ -616,15 +616,16 @@ fhandler_tty_slave::close ()
fhandler_console::open_fhs, archetype->usecount); fhandler_console::open_fhs, archetype->usecount);
if (--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"); termios_printf ("just exiting because archetype usecount is > 0");
return 0; return 0;
} }
termios_printf ("closing last open %s handle", pc.dev.name); termios_printf ("closing last open %s handle", pc.dev.name);
fhandler_tty_slave *arch = (fhandler_tty_slave *) archetype; return fhandler_tty_common::close ();
int res = fhandler_tty_common::close ();
cygheap->fdtab.delete_archetype (arch);
return res;
} }
int int
@ -910,7 +911,7 @@ fhandler_tty_slave::dup (fhandler_base *child)
fhandler_console::open_fhs++; fhandler_console::open_fhs++;
fhandler_tty_slave *arch = (fhandler_tty_slave *) archetype; fhandler_tty_slave *arch = (fhandler_tty_slave *) archetype;
*(fhandler_tty_slave *) child = *arch; *(fhandler_tty_slave *) child = *arch;
archetype->usecount++; arch->usecount++;
child->usecount = 0; child->usecount = 0;
myself->set_ctty (get_ttyp (), openflags, arch); myself->set_ctty (get_ttyp (), openflags, arch);
termios_printf ("incremented open_fhs %d, archetype usecount %d", termios_printf ("incremented open_fhs %d, archetype usecount %d",
@ -1331,7 +1332,7 @@ fhandler_pty_master::ptsname ()
void void
fhandler_tty_common::set_close_on_exec (int val) fhandler_tty_common::set_close_on_exec (int val)
{ {
if (get_major () == DEV_TTYS_MAJOR) if (archetype)
set_close_on_exec_flag (val); set_close_on_exec_flag (val);
else else
{ {