Actually free Process fd_map entries when a file is closed...
authorSteve Reinhardt <stever@eecs.umich.edu>
Fri, 11 Nov 2005 02:08:33 +0000 (21:08 -0500)
committerSteve Reinhardt <stever@eecs.umich.edu>
Fri, 11 Nov 2005 02:08:33 +0000 (21:08 -0500)
amazingly we never did that before.  Caused us to run out of
file descriptors in twolf.

sim/process.cc:
    Add free_fd() method to free closed target fd in simulator fd map.
    Rename open_fd() to alloc_fd() for symmetry with free_fd().
sim/process.hh:
    Add free_fd() method to free closed target fd in simulator fd map.
    Rename open_fd() to alloc_fd() for symmetry with free_fd().
    Crank up MAX_FD while we're at it.
sim/syscall_emul.cc:
    Call free_fd() on process when target closes a file.
sim/syscall_emul.hh:
    Process open_fd() renamed to alloc_fd().

--HG--
extra : convert_revision : d780f4ccfd5a0989230b0afbdbd276212b87550c

sim/process.cc
sim/process.hh
sim/syscall_emul.cc
sim/syscall_emul.hh

index b04582233ddbf18cf2d5aed3aafdec7242192083..a6cf5ded7de2e6cbd6fb8161c4ec1f9f3eedcee6 100644 (file)
@@ -191,23 +191,32 @@ Process::dup_fd(int sim_fd, int tgt_fd)
 
 // generate new target fd for sim_fd
 int
-Process::open_fd(int sim_fd)
+Process::alloc_fd(int sim_fd)
 {
-    int free_fd;
-
     // in case open() returns an error, don't allocate a new fd
     if (sim_fd == -1)
         return -1;
 
     // find first free target fd
-    for (free_fd = 0; fd_map[free_fd] >= 0; ++free_fd) {
-        if (free_fd == MAX_FD)
-            panic("Process::open_fd: out of file descriptors!");
+    for (int free_fd = 0; free_fd < MAX_FD; ++free_fd) {
+        if (fd_map[free_fd] == -1) {
+            fd_map[free_fd] = sim_fd;
+            return free_fd;
+        }
     }
 
-    fd_map[free_fd] = sim_fd;
+    panic("Process::alloc_fd: out of file descriptors!");
+}
+
+
+// free target fd (e.g., after close)
+void
+Process::free_fd(int tgt_fd)
+{
+    if (fd_map[tgt_fd] == -1)
+        warn("Process::free_fd: request to free unused fd %d", tgt_fd);
 
-    return free_fd;
+    fd_map[tgt_fd] = -1;
 }
 
 
index 28c16a44476ee82b7a762de3e3925b0b43051803..2116ef6322e2cbd15502a5aa24241600cf5dc310 100644 (file)
@@ -124,7 +124,7 @@ class Process : public SimObject
 
   private:
     // file descriptor remapping support
-    static const int MAX_FD = 100;     // max legal fd value
+    static const int MAX_FD = 256;     // max legal fd value
     int fd_map[MAX_FD+1];
 
   public:
@@ -146,7 +146,10 @@ class Process : public SimObject
     void dup_fd(int sim_fd, int tgt_fd);
 
     // generate new target fd for sim_fd
-    int open_fd(int sim_fd);
+    int alloc_fd(int sim_fd);
+
+    // free target fd (e.g., after close)
+    void free_fd(int tgt_fd);
 
     // look up simulator fd for given target fd
     int sim_fd(int tgt_fd);
index 4ae2d263141d24fc5d5f9d49527715dc193db70f..50650018eb54dfbec32baaa153720f6056c067ba 100644 (file)
@@ -110,8 +110,11 @@ obreakFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 SyscallReturn
 closeFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
-    int fd = p->sim_fd(xc->getSyscallArg(0));
-    return close(fd);
+    int target_fd = xc->getSyscallArg(0);
+    int status = close(p->sim_fd(target_fd));
+    if (status >= 0)
+        p->free_fd(target_fd);
+    return status;
 }
 
 
index 17889113e05ded0483a2bb203cb92300d655d157..f22b6dcb76b2cf30b28a25c3cf46b187aa32a721 100644 (file)
@@ -339,7 +339,7 @@ openFunc(SyscallDesc *desc, int callnum, Process *process,
     // open the file
     int fd = open(path.c_str(), hostFlags, mode);
 
-    return (fd == -1) ? -errno : process->open_fd(fd);
+    return (fd == -1) ? -errno : process->alloc_fd(fd);
 }