From fcbf23762f42529d5d51c5af154a617e01055ae3 Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Mon, 31 May 2021 13:09:21 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=F0=9F=90=9B=20close=20file=20descr?= =?UTF-8?q?iptors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- impl-c/fs/vfs.c | 2 +- impl-c/include/proc/task.h | 3 +++ impl-c/proc/sched.c | 11 +---------- impl-c/proc/task.c | 39 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/impl-c/fs/vfs.c b/impl-c/fs/vfs.c index 1e8eb5497..28a830fb9 100644 --- a/impl-c/fs/vfs.c +++ b/impl-c/fs/vfs.c @@ -173,7 +173,7 @@ struct file *vfs_open(const char *pathname, int flags) { } int vfs_close(struct file *file) { - // 1. release the file descriptor + kfree(file); return 0; } diff --git a/impl-c/include/proc/task.h b/impl-c/include/proc/task.h index 65b8d6c3d..65e7900b6 100644 --- a/impl-c/include/proc/task.h +++ b/impl-c/include/proc/task.h @@ -41,6 +41,9 @@ struct task_struct { }; struct task_struct *task_create(void *func); + +void task_free(struct task_struct *task); + void cur_task_exit(); extern uint32_t new_tid; diff --git a/impl-c/proc/sched.c b/impl-c/proc/sched.c index 30208bae7..43fe9f186 100644 --- a/impl-c/proc/sched.c +++ b/impl-c/proc/sched.c @@ -69,17 +69,8 @@ void kill_zombies() { task = ((struct task_entry *)entry)->task; log_println("recycle space for task:%d", task->id); list_del(entry); - kfree(entry); - // TODO: manage parent code free and child code free - // if (task->code) { - // kfree(task->code); - // } - if (task->user_stack) { - kfree((void *)task->user_stack); - } - kfree((void *)task->kernel_stack); - kfree(task); + task_free(task); } } diff --git a/impl-c/proc/task.c b/impl-c/proc/task.c index 001f6a231..3379136ea 100644 --- a/impl-c/proc/task.c +++ b/impl-c/proc/task.c @@ -28,6 +28,7 @@ static const int _DO_LOG = 0; static void foo(); extern void fork_child_eret(); +static inline void close_fd(struct task_struct *task, int fd); uint32_t new_tid = 0; @@ -70,6 +71,25 @@ struct task_struct *task_create(void *func) { return t; } +void task_free(struct task_struct *task) { + // TODO: manage parent code free and child code free + // if (task->code) { + // kfree(task->code); + // } + if (task->user_stack) { + kfree((void *)task->user_stack); + } + kfree((void *)task->kernel_stack); + + // Close all file descriptors + for (int i = 0; i < TASK_MX_NUM_FD; i++) { + if (task->fd[i] != NULL) { + close_fd(task, i); + } + } + kfree(task); +} + int sys_getpid() { struct task_struct *task = get_current(); return task->id; @@ -94,6 +114,7 @@ int sys_open(const char *pathname, int flags) { for (int i = 0; i < TASK_MX_NUM_FD; i++) { if (task->fd[i] == NULL) { task->fd[i] = file; + task->fd_size++; return i; } } @@ -101,13 +122,27 @@ int sys_open(const char *pathname, int flags) { return -1; } +void close_fd(struct task_struct *task, int fd) { + if (task->fd[fd] != NULL) { + vfs_close(task->fd[fd]); + task->fd[fd] = NULL; + } + // check for bugs + task->fd_size--; + if (task->fd_size < 0) { + uart_println("[Task free] BUG!!! fd not synce"); + while (1) { + ; + } + } +} + int sys_close(int fd) { struct task_struct *task = get_current(); if ((fd < 0 || fd > TASK_MX_NUM_FD) || (task->fd[fd] == NULL)) { return -1; } - task->fd[fd] = NULL; - task->fd_size--; + close_fd(task, fd); return 0; }