* 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:
parent
ad87edbe61
commit
0646a508aa
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -237,27 +237,14 @@ dtable::find_unused_handle (int start)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
void
|
||||||
dtable::release (int fd)
|
dtable::release (int fd)
|
||||||
{
|
|
||||||
bool deleted;
|
|
||||||
if (not_open (fd))
|
|
||||||
deleted = false;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (fds[fd]->need_fixup_before ())
|
if (fds[fd]->need_fixup_before ())
|
||||||
dec_need_fixup_before ();
|
dec_need_fixup_before ();
|
||||||
if (fds[fd]->refcnt (-1) > 0)
|
fds[fd]->refcnt (-1);
|
||||||
deleted = false;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
deleted = true;
|
|
||||||
delete fds[fd];
|
|
||||||
}
|
|
||||||
fds[fd] = NULL;
|
fds[fd] = NULL;
|
||||||
}
|
}
|
||||||
return deleted;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
cygwin_attach_handle_to_fd (char *name, int fd, HANDLE handle, mode_t bin,
|
cygwin_attach_handle_to_fd (char *name, int fd, HANDLE handle, mode_t bin,
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue