* 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:
parent
2f8a6f1947
commit
09244c002e
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 *);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user