diff --git a/headers/task.h b/headers/task.h index aae4016..75c0e31 100644 --- a/headers/task.h +++ b/headers/task.h @@ -36,6 +36,7 @@ i8 create_kernel_task(void); void remove_task(struct task *task); struct task *copy_task(const struct task *task); void kfork(struct task *daddy); +void zombify_task(struct task *task); // utils void exec_fn(void (*fn)(void)); diff --git a/src/multitasking/scheduler.c b/src/multitasking/scheduler.c index 3368050..97769a4 100644 --- a/src/multitasking/scheduler.c +++ b/src/multitasking/scheduler.c @@ -12,15 +12,15 @@ struct task *current_task; void scheduler(void) { // ZOMBIE, THREAD, RUN, WAIT, SLEEP, STOPPED, FORKED - void (*func[])(struct task *) = {remove_task, NULL, NULL, NULL, - NULL, remove_task, kfork}; + void (*func[])(struct task *) = {zombify_task, NULL, NULL, NULL, + NULL, remove_task, kfork}; if (!current_task) // || current_task->next == current_task) return; cli(); struct task *it = current_task->next; while (it && it->status != RUN) { - if (it != current_task && func[it->status]) { + if (current_task->pid == 0 && func[it->status]) { struct task *new_it = it->prev; func[it->status](it); it = new_it; diff --git a/src/multitasking/task.c b/src/multitasking/task.c index 12aee49..45ff1e6 100644 --- a/src/multitasking/task.c +++ b/src/multitasking/task.c @@ -63,23 +63,34 @@ void exec_fn(void (*fn)(void)) new_task->eip = (u32 *)fn; } +void zombify_task(struct task *task) +{ + cli(); // Technically useless + free_pages(task->heap, 4096); + free_pages(task->esp0, STACK_SIZE); + task->esp0 = NULL; + task->heap = NULL; + toris(); +} + void remove_task(struct task *task) { + cli(); struct task *left = task->prev; struct task *right = task->next; - if (task->child) + + if (task->child) { remove_task(task->child); + task->child = NULL; + } if (task->heap) free_pages(task->heap, 4096); if (task->esp0) free_pages(task->esp0, STACK_SIZE); - task->heap = NULL; - task->esp0 = NULL; - if (task->status != ZOMBIE) { - left->next = right; - right->prev = left; - vfree(task); - } + left->next = right; + right->prev = left; + vfree(task); + toris(); } struct task *copy_task(const struct task *task) @@ -104,5 +115,5 @@ void exit_task(void) current_task->status = STOPPED; } toris(); - asm volatile("jmp scheduler"); + scheduler(); }