diff options
author | Anton Kling <anton@kling.gg> | 2024-04-02 12:03:52 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-02 12:03:52 +0200 |
commit | e25a47fcc4db09ab9b845a691297da67243e6049 (patch) | |
tree | dfb7c473e001fa93a1a8018c36992a5bc77ae5c3 /kernel/sched | |
parent | 2229fd91f7230ae7068814ae029b733945852eb1 (diff) |
Kernel: Use "struct list" to handle file descriptors instead of a fixed sized array
Diffstat (limited to 'kernel/sched')
-rw-r--r-- | kernel/sched/scheduler.c | 45 | ||||
-rw-r--r-- | kernel/sched/scheduler.h | 4 |
2 files changed, 17 insertions, 32 deletions
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c index 2fa9ad3..52e4848 100644 --- a/kernel/sched/scheduler.c +++ b/kernel/sched/scheduler.c @@ -118,6 +118,20 @@ process_t *create_process(process_t *p, u32 esp, u32 eip) { r->tcb = kcalloc(1, sizeof(struct TCB)); r->tcb->CR3 = r->cr3->physical_address; + if (p) { + list_clone(&p->file_descriptors, &r->file_descriptors); + for (int i = 0;; i++) { + vfs_fd_t *out; + if (!list_get(&p->file_descriptors, i, (void **)&out)) { + break; + } + if (out) { + out->reference_count++; + } + } + } else { + list_init(&r->file_descriptors); + } list_init(&r->read_list); list_init(&r->write_list); list_init(&r->disconnect_list); @@ -149,39 +163,9 @@ process_t *create_process(process_t *p, u32 esp, u32 eip) { strcpy(r->current_working_directory, "/"); } r->data_segment_end = (p) ? p->data_segment_end : NULL; - for (int i = 0; i < 100; i++) { - if (p) { - r->file_descriptors[i] = p->file_descriptors[i]; - if (r->file_descriptors[i]) { - r->file_descriptors[i]->reference_count++; - } - } else { - r->file_descriptors[i] = NULL; - } - } return r; } -int get_free_fd(process_t *p, int allocate) { - if (!p) { - p = (process_t *)current_task; - } - int i; - for (i = 0; i < 100; i++) { - if (!p->file_descriptors[i]) { - break; - } - } - if (p->file_descriptors[i]) { - return -1; - } - if (allocate) { - vfs_fd_t *fd = p->file_descriptors[i] = kmalloc(sizeof(vfs_fd_t)); - fd->inode = kmalloc(sizeof(vfs_inode_t)); - } - return i; -} - void tasking_init(void) { current_task = ready_queue = create_process(NULL, 0, 0); current_task_TCB = current_task->tcb; @@ -216,6 +200,7 @@ void free_process(process_t *p) { list_free(&p->tcp_sockets); list_free(&p->tcp_listen); list_free(&p->event_queue); + list_free(&p->file_descriptors); kfree(p->tcb); } diff --git a/kernel/sched/scheduler.h b/kernel/sched/scheduler.h index b408f59..bdf32d4 100644 --- a/kernel/sched/scheduler.h +++ b/kernel/sched/scheduler.h @@ -62,7 +62,8 @@ struct Process { void *interrupt_handler; PageDirectory *cr3; struct IpcMailbox ipc_mailbox; - vfs_fd_t *file_descriptors[100]; + + struct list file_descriptors; struct list read_list; struct list write_list; @@ -97,7 +98,6 @@ struct Process { }; bool get_task_from_pid(u32 pid, process_t **out); -int get_free_fd(process_t *p, int allocate); void free_process(process_t *p); void *get_free_virtual_memory(size_t length); #endif |