From 5e01ebfc56b058a4431c5a69a3c4cdd3f7adbed7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 1 Aug 2019 20:17:12 +0200 Subject: [PATCH] Kernel: Clean up thread stacks when a thread dies We were forgetting where we put the userspace thread stacks, so added a member called Thread::m_userspace_thread_stack to keep track of it. Then, in ~Thread(), we now deallocate the userspace, kernel and signal stacks (if present.) Out of curiosity, the "init_stage2" process doesn't have a kernel stack which I found surprising. :^) --- Kernel/Thread.cpp | 15 ++++++++++++--- Kernel/Thread.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index d9fa8f4413..4edf777343 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -92,6 +92,15 @@ Thread::~Thread() if (selector()) gdt_free_entry(selector()); + + if (m_userspace_stack_region) + m_process.deallocate_region(*m_userspace_stack_region); + + if (m_kernel_stack_region) + m_process.deallocate_region(*m_kernel_stack_region); + + if (m_kernel_stack_for_signal_handler_region) + m_process.deallocate_region(*m_kernel_stack_for_signal_handler_region); } void Thread::unblock() @@ -503,9 +512,9 @@ void Thread::make_userspace_stack_for_main_thread(Vector arguments, Vect void Thread::make_userspace_stack_for_secondary_thread(void* argument) { - auto* region = m_process.allocate_region(VirtualAddress(), default_userspace_stack_size, String::format("Stack (Thread %d)", tid())); - ASSERT(region); - m_tss.esp = region->vaddr().offset(default_userspace_stack_size).get(); + m_userspace_stack_region = m_process.allocate_region(VirtualAddress(), default_userspace_stack_size, String::format("Stack (Thread %d)", tid())); + ASSERT(m_userspace_stack_region); + m_tss.esp = m_userspace_stack_region->vaddr().offset(default_userspace_stack_size).get(); // NOTE: The stack needs to be 16-byte aligned. push_value_on_stack((u32)argument); diff --git a/Kernel/Thread.h b/Kernel/Thread.h index 74b1c417d6..4bfa72e11a 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -326,6 +326,7 @@ private: u32 m_pending_signals { 0 }; u32 m_signal_mask { 0 }; u32 m_kernel_stack_base { 0 }; + RefPtr m_userspace_stack_region; RefPtr m_kernel_stack_region; RefPtr m_kernel_stack_for_signal_handler_region; SignalActionData m_signal_action_data[32];