summaryrefslogtreecommitdiff
path: root/kernel/sched
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-02 12:03:52 +0200
committerAnton Kling <anton@kling.gg>2024-04-02 12:03:52 +0200
commite25a47fcc4db09ab9b845a691297da67243e6049 (patch)
treedfb7c473e001fa93a1a8018c36992a5bc77ae5c3 /kernel/sched
parent2229fd91f7230ae7068814ae029b733945852eb1 (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.c45
-rw-r--r--kernel/sched/scheduler.h4
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