* cygheap.h (cygheap_fdmanip::release): Simplify.

* dtable.cc (dtable::release): Make void again.  Skip not_open check since it
is guaranteed to be open.  Don't bother deleting here since actual deletion
will be handled in cygheap_fdget::~cygheap_fdget.
* dtable.h (dtable::release): Make void again.
* syscalls.cc (dup2): Bump fhandler use count on successful dup.
This commit is contained in:
Christopher Faylor 2012-01-22 07:27:57 +00:00
parent ad87edbe61
commit 0646a508aa
5 changed files with 19 additions and 28 deletions

View File

@ -1,3 +1,12 @@
2012-01-22 Christopher Faylor <me.cygwin2012@cgf.cx>
* cygheap.h (cygheap_fdmanip::release): Simplify.
* dtable.cc (dtable::release): Make void again. Skip not_open check
since it is guaranteed to be open. Don't bother deleting here since
actual deletion will be handled in cygheap_fdget::~cygheap_fdget.
* dtable.h (dtable::release): Make void again.
* syscalls.cc (dup2): Bump fhandler use count on successful dup.
2012-01-22 Christopher Faylor <me.cygwin2012@cgf.cx> 2012-01-22 Christopher Faylor <me.cygwin2012@cgf.cx>
* cygheap.h (cygheap_fdget::~cygheap_fdget): Simplify now that refcnt * cygheap.h (cygheap_fdget::~cygheap_fdget): Simplify now that refcnt

View File

@ -407,12 +407,7 @@ public:
delete fh; delete fh;
} }
} }
void release () void release () { cygheap->fdtab.release (fd); }
{
fh = cygheap->fdtab[fd];
if (cygheap->fdtab.release (fd))
fh = NULL;
}
}; };
class cygheap_fdenum : public cygheap_fdmanip class cygheap_fdenum : public cygheap_fdmanip

View File

@ -237,26 +237,13 @@ dtable::find_unused_handle (int start)
return -1; return -1;
} }
bool void
dtable::release (int fd) dtable::release (int fd)
{ {
bool deleted; if (fds[fd]->need_fixup_before ())
if (not_open (fd)) dec_need_fixup_before ();
deleted = false; fds[fd]->refcnt (-1);
else fds[fd] = NULL;
{
if (fds[fd]->need_fixup_before ())
dec_need_fixup_before ();
if (fds[fd]->refcnt (-1) > 0)
deleted = false;
else
{
deleted = true;
delete fds[fd];
}
fds[fd] = NULL;
}
return deleted;
} }
extern "C" int extern "C" int

View File

@ -1,7 +1,7 @@
/* dtable.h: fd table definition. /* dtable.h: fd table definition.
Copyright 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, Copyright 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011 Red Hat, Inc. 2010, 2011, 2012 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -63,7 +63,7 @@ public:
} }
int find_unused_handle (int start); int find_unused_handle (int start);
int find_unused_handle () { return find_unused_handle (first_fd_for_open);} int find_unused_handle () { return find_unused_handle (first_fd_for_open);}
bool release (int fd) __attribute__ ((regparm (2))); void release (int fd) __attribute__ ((regparm (2)));
void init_std_file_from_handle (int fd, HANDLE handle); void init_std_file_from_handle (int fd, HANDLE handle);
int dup3 (int oldfd, int newfd, int flags); int dup3 (int oldfd, int newfd, int flags);
void fixup_after_exec (); void fixup_after_exec ();

View File

@ -139,8 +139,8 @@ dup2 (int oldfd, int newfd)
cygheap_fdget cfd (oldfd); cygheap_fdget cfd (oldfd);
res = (cfd >= 0) ? oldfd : -1; res = (cfd >= 0) ? oldfd : -1;
} }
else else if ((res = cygheap->fdtab.dup3 (oldfd, newfd, 0)) == newfd)
res = cygheap->fdtab.dup3 (oldfd, newfd, 0); cygheap->fdtab[newfd]->refcnt (1);
syscall_printf ("%R = dup2(%d, %d)", res, oldfd, newfd); syscall_printf ("%R = dup2(%d, %d)", res, oldfd, newfd);
return res; return res;