From 621d3f8abb336a370859aa7fe3ff6d6cc9ae6eaa Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Mon, 14 Dec 2015 14:34:44 -0600 Subject: [PATCH] XThread free stack on destruction --- src/xenia/kernel/xthread.cc | 15 ++++++++++++++- src/xenia/kernel/xthread.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/xenia/kernel/xthread.cc b/src/xenia/kernel/xthread.cc index ca0fe1a8c..8056878c4 100644 --- a/src/xenia/kernel/xthread.cc +++ b/src/xenia/kernel/xthread.cc @@ -89,6 +89,7 @@ XThread::~XThread() { kernel_state()->memory()->SystemHeapFree(scratch_address_); kernel_state()->memory()->SystemHeapFree(tls_address_); kernel_state()->memory()->SystemHeapFree(pcr_address_); + FreeStack(); if (thread_) { // TODO(benvanik): platform kill @@ -214,7 +215,7 @@ bool XThread::AllocateStack(uint32_t size) { auto heap = memory()->LookupHeap(0x40000000); auto alignment = heap->page_size(); - auto padding = heap->page_size() * 2; // Guard pages + auto padding = heap->page_size() * 2; // Guard page size * 2 size = xe::round_up(size, alignment); auto actual_size = size + padding; @@ -241,6 +242,18 @@ bool XThread::AllocateStack(uint32_t size) { return true; } +void XThread::FreeStack() { + if (stack_alloc_base_) { + auto heap = memory()->LookupHeap(0x40000000); + heap->Release(stack_alloc_base_); + + stack_alloc_base_ = 0; + stack_alloc_size_ = 0; + stack_base_ = 0; + stack_limit_ = 0; + } +} + X_STATUS XThread::Create() { // Thread kernel object. if (!CreateNative()) { diff --git a/src/xenia/kernel/xthread.h b/src/xenia/kernel/xthread.h index c145ed0e5..2ccc0d15b 100644 --- a/src/xenia/kernel/xthread.h +++ b/src/xenia/kernel/xthread.h @@ -196,6 +196,7 @@ class XThread : public XObject { protected: bool AllocateStack(uint32_t size); + void FreeStack(); void InitializeGuestObject(); bool StepToAddress(uint32_t pc);