summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h1
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc67
2 files changed, 41 insertions, 27 deletions
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index 3811a2e2..aeefe1d2 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -67,6 +67,7 @@ namespace Kernel
SizeT MemoryLimit{kSchedMaxMemoryLimit};
SizeT UsedMemory{0UL};
+ /// @brief Allocation tracker structure.
struct USER_HEAP_TREE final
{
VoidPtr MemoryEntry{nullptr};
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.