From fa3292fa28a581f802deff3a5e73bb2b37405289 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 26 Mar 2023 15:30:15 +0200 Subject: [PATCH] memset the memory to 0 before freeing --- source/utils/CThread.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/utils/CThread.h b/source/utils/CThread.h index 910b1fd..454067a 100644 --- a/source/utils/CThread.h +++ b/source/utils/CThread.h @@ -28,10 +28,11 @@ public: typedef void (*Callback)(CThread *thread, void *arg); //! constructor - explicit CThread(int32_t iAttr, int32_t iPriority = 16, int32_t iStackSize = 0x8000, CThread::Callback callback = nullptr, void *callbackArg = nullptr) + explicit CThread(int32_t iAttr, int32_t iPriority = 16, int32_t stacksize = 0x8000, CThread::Callback callback = nullptr, void *callbackArg = nullptr) : pThread(nullptr), pThreadStack(nullptr), pCallback(callback), pCallbackArg(callbackArg) { //! save attribute assignment iAttributes = iAttr; + iStackSize = stacksize; //! allocate the thread on the default Cafe OS heap pThread = (OSThread *) gMEMAllocFromDefaultHeapExForThreads(sizeof(OSThread), 0x10); //! allocate the stack on the default Cafe OS heap @@ -123,11 +124,15 @@ public: } OSJoinThread(pThread, nullptr); } + // Some games (e.g. Minecraft) expect the default heap to be empty. + // Make sure to clean up the memory after using it //! free the thread stack buffer if (pThreadStack) { + memset(pThreadStack, 0, iStackSize); gMEMFreeToDefaultHeapForThreads(pThreadStack); } if (pThread) { + memset(pThread, 0, sizeof(OSThread)); gMEMFreeToDefaultHeapForThreads(pThread); } pThread = nullptr; @@ -151,6 +156,7 @@ private: return 0; } + uint32_t iStackSize; int32_t iAttributes; OSThread *pThread; uint8_t *pThreadStack;