summaryrefslogtreecommitdiff
path: root/sim/process.cc
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2005-11-10 21:08:33 -0500
committerSteve Reinhardt <stever@eecs.umich.edu>2005-11-10 21:08:33 -0500
commit4410876773fa076a2b197cfbaf23ceea73137397 (patch)
tree8af6c6e78f944c8b6f1df34c23ea2e4315f146a3 /sim/process.cc
parent99bf6ed0849085588c3d51679218c5b53ab4b9c0 (diff)
downloadgem5-4410876773fa076a2b197cfbaf23ceea73137397.tar.xz
Actually free Process fd_map entries when a file is closed...
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
Diffstat (limited to 'sim/process.cc')
-rw-r--r--sim/process.cc25
1 files changed, 17 insertions, 8 deletions
diff --git a/sim/process.cc b/sim/process.cc
index b04582233..a6cf5ded7 100644
--- a/sim/process.cc
+++ b/sim/process.cc
@@ -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;
}