From a9d3bdba6f412cf1a3b4f0515f922d164cbb8585 Mon Sep 17 00:00:00 2001 From: apio Date: Tue, 18 Oct 2022 17:18:37 +0200 Subject: [PATCH] Kernel: Keep track of a task's PPID --- kernel/include/thread/Task.h | 1 + kernel/src/sys/exec.cpp | 2 ++ kernel/src/thread/Scheduler.cpp | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/kernel/include/thread/Task.h b/kernel/include/thread/Task.h index e59b9ad2..cd2dc780 100644 --- a/kernel/include/thread/Task.h +++ b/kernel/include/thread/Task.h @@ -18,6 +18,7 @@ struct Task }; uint64_t id; + uint64_t ppid; Context regs; int64_t task_sleep = 0; diff --git a/kernel/src/sys/exec.cpp b/kernel/src/sys/exec.cpp index 4f7acfb9..74b37999 100644 --- a/kernel/src/sys/exec.cpp +++ b/kernel/src/sys/exec.cpp @@ -41,6 +41,8 @@ void sys_fork(Context* context) child->address_space = parent->address_space.clone(); + child->ppid = parent->id; + child->regs.rax = 0; context->rax = child->id; diff --git a/kernel/src/thread/Scheduler.cpp b/kernel/src/thread/Scheduler.cpp index 17493c6d..b3e8c746 100644 --- a/kernel/src/thread/Scheduler.cpp +++ b/kernel/src/thread/Scheduler.cpp @@ -102,6 +102,7 @@ void Scheduler::add_kernel_task(const char* taskname, void (*task)(void)) ASSERT(new_task); new_task->user_task = false; new_task->id = free_tid++; + new_task->ppid = 0; new_task->regs.rip = (uint64_t)task; new_task->allocated_stack = (uint64_t)MemoryManager::get_pages(TASK_PAGES_IN_STACK); // 16 KB is enough for everyone, right? @@ -128,6 +129,7 @@ Task* Scheduler::create_user_task() memset(&new_task->regs, 0, sizeof(Context)); new_task->user_task = true; new_task->id = free_tid++; + new_task->ppid = 0; new_task->task_sleep = 0; new_task->task_time = 0; new_task->cpu_time = 0; @@ -152,9 +154,11 @@ long Scheduler::load_user_task(const char* filename) ASSERT(new_task); memset(&new_task->regs, 0, sizeof(Context)); new_task->id = free_tid++; + new_task->ppid = 0; if (!new_task->allocator.init()) { delete new_task; + free_tid--; Interrupts::pop(); return -ENOMEM; } @@ -173,6 +177,7 @@ long Scheduler::load_user_task(const char* filename) { new_task->address_space.destroy(); delete new_task; + free_tid--; ELFLoader::release_elf_image(image); VMM::switch_back_to_kernel_address_space(); Interrupts::pop();