From c68bfbfcac5c6b4e4fa0ca5596eeac7d452b76cd Mon Sep 17 00:00:00 2001 From: Amlal Date: Thu, 24 Apr 2025 20:15:54 +0200 Subject: dev, kernel: scheduler: fully implement traversal and cleanup. Signed-off-by: Amlal --- dev/kernel/src/UserProcessScheduler.cc | 67 ++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 27 deletions(-) (limited to 'dev/kernel/src') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 660dd544..aaf0d699 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -108,7 +108,7 @@ namespace Kernel /** @brief Allocate pointer to heap tree. */ /***********************************************************************************/ - USER_PROCESS::USER_HEAP_TREE* sched_try_go_upper_heap_tree(USER_PROCESS::USER_HEAP_TREE* tree) + STATIC USER_PROCESS::USER_HEAP_TREE* sched_try_go_upper_heap_tree(USER_PROCESS::USER_HEAP_TREE* tree) { if (tree) { @@ -175,7 +175,8 @@ namespace Kernel if (entry->MemoryNext) { - entry = entry->MemoryNext; + is_parent = NO; + entry = entry->MemoryNext; } else if (entry->MemoryChild) { @@ -190,24 +191,24 @@ namespace Kernel } if (!entry) - entry = new USER_HEAP_TREE(); + entry = new USER_HEAP_TREE(); - entry->MemoryEntry = ptr; - entry->MemoryEntrySize = sz; - entry->MemoryEntryPad = pad_amount; + entry->MemoryEntry = ptr; + entry->MemoryEntrySize = sz; + entry->MemoryEntryPad = pad_amount; if (is_parent) { - entry->MemoryParent = prev_entry; - prev_entry->MemoryChild = entry; + entry->MemoryParent = prev_entry; + prev_entry->MemoryChild = entry; prev_entry->MemoryColor = USER_HEAP_TREE::kBlackMemory; - entry->MemoryColor = USER_HEAP_TREE::kRedMemory; + entry->MemoryColor = USER_HEAP_TREE::kRedMemory; } else { prev_entry->MemoryNext = entry; - entry->MemoryPrev = prev_entry; + entry->MemoryPrev = prev_entry; } } @@ -252,26 +253,11 @@ namespace Kernel } /***********************************************************************************/ - /** - @brief Exit process method. - @param exit_code The process's exit code. - */ + /** @brief Free heap tree. */ /***********************************************************************************/ - Void USER_PROCESS::Exit(const Int32& exit_code) + STATIC Void sched_free_heap_tree(USER_PROCESS::USER_HEAP_TREE* memory_heap_list) { - this->Status = exit_code > 0 ? ProcessStatusKind::kKilled : ProcessStatusKind::kFrozen; - this->fLastExitCode = exit_code; - - kLastExitCode = exit_code; - - auto memory_heap_list = this->HeapTree; - -#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - auto pd = hal_read_cr3(); - hal_write_cr3(this->VMRegister); -#endif - // Deleting memory lists. Make sure to free all of them. while (memory_heap_list) { @@ -288,8 +274,35 @@ namespace Kernel mm_delete_heap(memory_heap_list); + if (memory_heap_list->MemoryChild) + sched_free_heap_tree(memory_heap_list->MemoryChild); + memory_heap_list = next; } + } + + /***********************************************************************************/ + /** + @brief Exit process method. + @param exit_code The process's exit code. + */ + /***********************************************************************************/ + + Void USER_PROCESS::Exit(const Int32& exit_code) + { + this->Status = exit_code > 0 ? ProcessStatusKind::kKilled : ProcessStatusKind::kFrozen; + this->fLastExitCode = exit_code; + + kLastExitCode = exit_code; + + auto memory_heap_list = this->HeapTree; + +#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ + auto pd = hal_read_cr3(); + hal_write_cr3(this->VMRegister); +#endif + + sched_free_heap_tree(memory_heap_list); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ //! Free the memory's page directory. -- cgit v1.2.3