aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYinan Xu <xuyinan@ict.ac.cn>2023-04-20 16:47:04 +0800
committerYinan Xu <xuyinan@ict.ac.cn>2023-04-20 16:50:47 +0800
commit5afa62e541b67a5ebd03a8783858484afc7920e1 (patch)
tree3219db90abe3f7587aef415ede578635e66ad067
parent0835bd7729f317a009d9bec775f8e4bf420f93a7 (diff)
downloadriscv-isa-sim-5afa62e541b67a5ebd03a8783858484afc7920e1.zip
riscv-isa-sim-5afa62e541b67a5ebd03a8783858484afc7920e1.tar.gz
riscv-isa-sim-5afa62e541b67a5ebd03a8783858484afc7920e1.tar.bz2
Close file descriptors in destructor of syscall_t
-rw-r--r--fesvr/syscall.cc13
-rw-r--r--fesvr/syscall.h2
2 files changed, 12 insertions, 3 deletions
diff --git a/fesvr/syscall.cc b/fesvr/syscall.cc
index 875ffb7..e277be1 100644
--- a/fesvr/syscall.cc
+++ b/fesvr/syscall.cc
@@ -174,9 +174,16 @@ syscall_t::syscall_t(htif_t* htif)
if (stdin_fd < 0 || stdout_fd0 < 0 || stdout_fd1 < 0)
throw std::runtime_error("could not dup stdin/stdout");
- fds.alloc(stdin_fd); // stdin -> stdin
- fds.alloc(stdout_fd0); // stdout -> stdout
- fds.alloc(stdout_fd1); // stderr -> stdout
+ fds_index.push_back(fds.alloc(stdin_fd)); // stdin -> stdin
+ fds_index.push_back(fds.alloc(stdout_fd0)); // stdout -> stdout
+ fds_index.push_back(fds.alloc(stdout_fd1)); // stderr -> stdout
+}
+
+syscall_t::~syscall_t() {
+ for (auto i: fds_index) {
+ close(fds.lookup(i));
+ fds.dealloc(i);
+ }
}
std::string syscall_t::do_chroot(const char* fn)
diff --git a/fesvr/syscall.h b/fesvr/syscall.h
index 4915efd..c002e6c 100644
--- a/fesvr/syscall.h
+++ b/fesvr/syscall.h
@@ -28,6 +28,7 @@ class syscall_t : public device_t
{
public:
syscall_t(htif_t*);
+ ~syscall_t();
void set_chroot(const char* where);
@@ -38,6 +39,7 @@ class syscall_t : public device_t
memif_t* memif;
std::vector<syscall_func_t> table;
fds_t fds;
+ std::vector<reg_t> fds_index;
void handle_syscall(command_t cmd);
void dispatch(addr_t mm);