diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2005-11-10 21:08:33 -0500 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2005-11-10 21:08:33 -0500 |
commit | 4410876773fa076a2b197cfbaf23ceea73137397 (patch) | |
tree | 8af6c6e78f944c8b6f1df34c23ea2e4315f146a3 /sim/process.cc | |
parent | 99bf6ed0849085588c3d51679218c5b53ab4b9c0 (diff) | |
download | gem5-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.cc | 25 |
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; } |