circ search in falloc (poor mans 2 minute free list)
authorBill Joy <bill@ucbvax.Berkeley.EDU>
Sun, 20 Jul 1980 11:11:47 +0000 (03:11 -0800)
committerBill Joy <bill@ucbvax.Berkeley.EDU>
Sun, 20 Jul 1980 11:11:47 +0000 (03:11 -0800)
SCCS-vsn: sys/kern/vfs_vnops.c 3.3

usr/src/sys/kern/vfs_vnops.c

index d2d2619..7f2500b 100644 (file)
@@ -1,4 +1,4 @@
-/*     vfs_vnops.c     3.2     %G%     */
+/*     vfs_vnops.c     3.3     %G%     */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -235,6 +235,7 @@ ufalloc()
        return(-1);
 }
 
        return(-1);
 }
 
+struct file *lastf = &file[0];
 /*
  * Allocate a user file descriptor
  * and a file structure.
 /*
  * Allocate a user file descriptor
  * and a file structure.
@@ -253,14 +254,19 @@ falloc()
        i = ufalloc();
        if(i < 0)
                return(NULL);
        i = ufalloc();
        if(i < 0)
                return(NULL);
-       for(fp = &file[0]; fp < &file[NFILE]; fp++)
-               if(fp->f_count == 0) {
-                       u.u_ofile[i] = fp;
-                       fp->f_count++;
-                       fp->f_un.f_offset = 0;
-                       return(fp);
-               }
+       for(fp = lastf; fp < &file[NFILE]; fp++)
+               if(fp->f_count == 0)
+                       goto slot;
+       for(fp = &file[0]; fp < lastf; fp++)
+               if(fp->f_count == 0)
+                       goto slot;
        printf("no file\n");
        u.u_error = ENFILE;
        return(NULL);
        printf("no file\n");
        u.u_error = ENFILE;
        return(NULL);
+slot:
+       u.u_ofile[i] = fp;
+       fp->f_count++;
+       fp->f_un.f_offset = 0;
+       lastf = fp + 1;
+       return(fp);
 }
 }