msvcrt-A11: next free fd cleanup

Jaco Greeff jaco at puxedo.org
Mon Nov 4 07:12:44 CST 2002


This patch in the msvcrt-A?? series, moves frequently used "marking the 
position of the next free fd" into a function of it's own.

License:
LGPL

Changelog:
* dlls/msvcrt/file.c: Jaco Greeff <jaco at puxedo.org>
- Move the frequently used check for the next available fd into an 
internal function of its own to avoid code duplication

--[ inline patch ]--

diff -aurN msvcrt-A10/dlls/msvcrt/file.c msvcrt-A11/dlls/msvcrt/file.c
--- msvcrt-A10/dlls/msvcrt/file.c	Mon Nov  4 14:34:28 2002
+++ msvcrt-A11/dlls/msvcrt/file.c	Mon Nov  4 15:06:39 2002
@@ -146,6 +146,18 @@
      MSVCRT_fdstart = fd;
  }

+/* INTERNAL: mark the next free slot */
+static void msvcrt_next_free(int fd)
+{
+    /* locate next free slot as in msvcrt_alloc_fd */
+    if (fd == MSVCRT_fdend)
+        MSVCRT_fdstart = ++MSVCRT_fdend;
+    else
+        while((MSVCRT_fdstart < MSVCRT_fdend) &&
+              (MSVCRT_handles[MSVCRT_fdstart] != INVALID_HANDLE_VALUE))
+            MSVCRT_fdstart++;
+}
+
  /* INTERNAL: Allocate an fd slot from a Win32 HANDLE */
  static int msvcrt_alloc_fd(HANDLE hand, int flag)
  {
@@ -160,13 +172,7 @@
    MSVCRT_handles[fd] = hand;
    MSVCRT_flags[fd] = flag;

-  /* locate next free slot */
-  if (fd == MSVCRT_fdend)
-    MSVCRT_fdstart = ++MSVCRT_fdend;
-  else
-    while(MSVCRT_fdstart < MSVCRT_fdend &&
- 
   MSVCRT_handles[MSVCRT_fdstart] != INVALID_HANDLE_VALUE)
-      MSVCRT_fdstart++;
+  msvcrt_next_free(fd);

    return fd;
  }
@@ -208,13 +214,7 @@
      MSVCRT_files[newfd] = NULL;
      MSVCRT_tempfiles[newfd] = NULL;

-    /* locate next free slot as in msvcrt_alloc_fd */
-    if (newfd == MSVCRT_fdend)
-        MSVCRT_fdstart = ++MSVCRT_fdend;
-    else
-        while((MSVCRT_fdstart < MSVCRT_fdend) &&
-              (MSVCRT_handles[MSVCRT_fdstart] != INVALID_HANDLE_VALUE))
-            MSVCRT_fdstart++;
+    msvcrt_next_free(newfd);

      return newfd;
  }
@@ -754,6 +754,12 @@
      MSVCRT_files[fd2] = NULL;
      MSVCRT_tempfiles[fd2] = NULL;

+    /* If fd2 was marked as the first free file descriptor,
+     * re-allocate it as not to be used
+     */
+    if (fd2 == MSVCRT_fdstart)
+        msvcrt_next_free(fd2);
+
      return 0;
  }





More information about the wine-patches mailing list