* cygheap.h (cygheap_fdnew): Avoid setting errno directly since it will have

been set by a previous function.
* dtable.h (dtable::extend): Accept second size_t argument.
* dtable.cc (dtable::extend): Accept second "min" argument which allows
checking for OPEN_MAX_MAX boundary conditions.
(dtable_init): Accommodate second argument to dtable::extend.
(dtable::find_unused_handle): Ditto.
* syscalls.cc (setdtablesize): Ditto.
(dup): Return any error passed by cygheap_fdnew() directly.
(getdtablesize): Just return dtable size directly.
This commit is contained in:
Christopher Faylor 2013-12-05 19:43:34 +00:00
parent 2f8a6f1947
commit 09244c002e
5 changed files with 33 additions and 10 deletions

View File

@ -1,3 +1,16 @@
2013-12-05 Christopher Faylor <me.cygwin2013@cgf.cx>
* cygheap.h (cygheap_fdnew): Avoid setting errno directly since it will
have been set by a previous function.
* dtable.h (dtable::extend): Accept second size_t argument.
* dtable.cc (dtable::extend): Accept second "min" argument which allows
checking for OPEN_MAX_MAX boundary conditions.
(dtable_init): Accommodate second argument to dtable::extend.
(dtable::find_unused_handle): Ditto.
* syscalls.cc (setdtablesize): Ditto.
(dup): Return any error passed by cygheap_fdnew() directly.
(getdtablesize): Just return dtable size directly.
2013-12-04 Christopher Faylor <me.cygwin2013@cgf.cx> 2013-12-04 Christopher Faylor <me.cygwin2013@cgf.cx>
* dtable.cc (dtable::find_unused_handle): When extending, always make * dtable.cc (dtable::find_unused_handle): When extending, always make

View File

@ -457,7 +457,7 @@ class cygheap_fdnew : public cygheap_fdmanip
locked = lockit; locked = lockit;
else else
{ {
set_errno (EMFILE); /* errno set by find_unused_handle */
if (lockit) if (lockit)
cygheap->fdtab.unlock (); cygheap->fdtab.unlock ();
locked = false; locked = false;

View File

@ -58,7 +58,7 @@ void
dtable_init () dtable_init ()
{ {
if (!cygheap->fdtab.size) if (!cygheap->fdtab.size)
cygheap->fdtab.extend (NOFILE_INCR); cygheap->fdtab.extend (NOFILE_INCR, 0);
} }
void __stdcall void __stdcall
@ -72,12 +72,16 @@ set_std_handle (int fd)
} }
int int
dtable::extend (size_t howmuch) dtable::extend (size_t howmuch, size_t min)
{ {
size_t new_size = size + howmuch; size_t new_size = size + howmuch;
fhandler_base **newfds; fhandler_base **newfds;
if (new_size > OPEN_MAX_MAX) if (new_size <= OPEN_MAX_MAX)
/* ok */;
else if (size < OPEN_MAX_MAX && min < OPEN_MAX_MAX)
new_size = OPEN_MAX_MAX;
else
{ {
set_errno (EMFILE); set_errno (EMFILE);
return 0; return 0;
@ -223,7 +227,7 @@ dtable::delete_archetype (fhandler_base *fh)
int int
dtable::find_unused_handle (size_t start) dtable::find_unused_handle (size_t start)
{ {
/* When extending, always make sure that there is a NOFILE_INCR chunk /* When extending, try to allocate a NOFILE_INCR chunk
following the empty fd. */ following the empty fd. */
size_t extendby = NOFILE_INCR + ((start >= size) ? 1 + start - size : 0); size_t extendby = NOFILE_INCR + ((start >= size) ? 1 + start - size : 0);
@ -238,7 +242,7 @@ dtable::find_unused_handle (size_t start)
goto out; goto out;
} }
} }
while (extend (extendby)); while (extend (extendby, start));
out: out:
return res; return res;
} }

View File

@ -52,7 +52,7 @@ public:
void vfork_parent_restore (); void vfork_parent_restore ();
void vfork_child_fixup (); void vfork_child_fixup ();
fhandler_base *dup_worker (fhandler_base *oldfh, int flags); fhandler_base *dup_worker (fhandler_base *oldfh, int flags);
int extend (size_t howmuch); int extend (size_t, size_t) __reg3;
void fixup_after_fork (HANDLE); void fixup_after_fork (HANDLE);
void fixup_close (size_t, fhandler_base *); void fixup_close (size_t, fhandler_base *);

View File

@ -120,7 +120,12 @@ close_all_files (bool norelease)
extern "C" int extern "C" int
dup (int fd) dup (int fd)
{ {
int res = cygheap->fdtab.dup3 (fd, cygheap_fdnew (), 0); int res;
int newfd = cygheap_fdnew ();
if (newfd < 0)
res = -1;
else
res = cygheap->fdtab.dup3 (fd, newfd, 0);
syscall_printf ("%R = dup(%d)", res, fd); syscall_printf ("%R = dup(%d)", res, fd);
return res; return res;
} }
@ -2611,7 +2616,8 @@ setdtablesize (int size)
return -1; return -1;
} }
if (size <= (int)cygheap->fdtab.size || cygheap->fdtab.extend (size - cygheap->fdtab.size)) if (size <= (int) cygheap->fdtab.size
|| cygheap->fdtab.extend (size - cygheap->fdtab.size, OPEN_MAX_MAX))
return 0; return 0;
return -1; return -1;
@ -2620,7 +2626,7 @@ setdtablesize (int size)
extern "C" int extern "C" int
getdtablesize () getdtablesize ()
{ {
return cygheap->fdtab.size > OPEN_MAX ? cygheap->fdtab.size : OPEN_MAX; return cygheap->fdtab.size;
} }
extern "C" int extern "C" int