]> sourceware.org Git - newlib-cygwin.git/commitdiff
* cygheap.h (cygheap_fdnew): Avoid setting errno directly since it will have
authorChristopher Faylor <me@cgf.cx>
Thu, 5 Dec 2013 19:43:34 +0000 (19:43 +0000)
committerChristopher Faylor <me@cgf.cx>
Thu, 5 Dec 2013 19:43:34 +0000 (19:43 +0000)
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.

winsup/cygwin/ChangeLog
winsup/cygwin/cygheap.h
winsup/cygwin/dtable.cc
winsup/cygwin/dtable.h
winsup/cygwin/syscalls.cc

index 490a7d675a8f111546f318289579ef5f52ef5781..68f05c4ddfc70800132a7249ebf4dd60d9aa8b6a 100644 (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>
 
        * dtable.cc (dtable::find_unused_handle): When extending, always make
index b4c478ffbcda30cb57c5990c474e070a1c502856..164a870906e63bf6f46adc1a4086efa9a6339bf5 100644 (file)
@@ -457,7 +457,7 @@ class cygheap_fdnew : public cygheap_fdmanip
       locked = lockit;
     else
       {
-       set_errno (EMFILE);
+       /* errno set by find_unused_handle */
        if (lockit)
          cygheap->fdtab.unlock ();
        locked = false;
index 454798427299dcb22fc16499b0587236776fea31..2e9ee54810dfeeba7cfdb2f1c81216c1a5105dd1 100644 (file)
@@ -58,7 +58,7 @@ void
 dtable_init ()
 {
   if (!cygheap->fdtab.size)
-    cygheap->fdtab.extend (NOFILE_INCR);
+    cygheap->fdtab.extend (NOFILE_INCR, 0);
 }
 
 void __stdcall
@@ -72,12 +72,16 @@ set_std_handle (int fd)
 }
 
 int
-dtable::extend (size_t howmuch)
+dtable::extend (size_t howmuch, size_t min)
 {
   size_t new_size = size + howmuch;
   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);
       return 0;
@@ -223,7 +227,7 @@ dtable::delete_archetype (fhandler_base *fh)
 int
 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.  */
   size_t extendby = NOFILE_INCR + ((start >= size) ? 1 + start - size : 0);
 
@@ -238,7 +242,7 @@ dtable::find_unused_handle (size_t start)
            goto out;
          }
     }
-  while (extend (extendby));
+  while (extend (extendby, start));
 out:
   return res;
 }
index 0ec7b3a753050b70a3aecd63a6956cb01e7ee15d..53ffca3e2c8777a43d8043c3dd0ab2001a93a22d 100644 (file)
@@ -52,7 +52,7 @@ public:
   void vfork_parent_restore ();
   void vfork_child_fixup ();
   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_close (size_t, fhandler_base *);
 
index 8769eb5828dedd5f71a15d368f30c3fc008d3fa9..cb97091656e285efa71e4e4e278da8f778926904 100644 (file)
@@ -120,7 +120,12 @@ close_all_files (bool norelease)
 extern "C" int
 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);
   return res;
 }
@@ -2611,7 +2616,8 @@ setdtablesize (int size)
       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 -1;
@@ -2620,7 +2626,7 @@ setdtablesize (int size)
 extern "C" int
 getdtablesize ()
 {
-  return cygheap->fdtab.size > OPEN_MAX ? cygheap->fdtab.size : OPEN_MAX;
+  return cygheap->fdtab.size;
 }
 
 extern "C" int
This page took 0.044123 seconds and 5 git commands to generate.