diff --git a/Core/HLE/HLEHelperThread.cpp b/Core/HLE/HLEHelperThread.cpp index a55e065d42..21c258dfed 100644 --- a/Core/HLE/HLEHelperThread.cpp +++ b/Core/HLE/HLEHelperThread.cpp @@ -49,8 +49,10 @@ HLEHelperThread::HLEHelperThread(const char *threadName, const char *module, con } HLEHelperThread::~HLEHelperThread() { - __KernelDeleteThread(id_, SCE_KERNEL_ERROR_THREAD_TERMINATED, "helper deleted"); - kernelMemory.Free(entry_); + if (id_) + __KernelDeleteThread(id_, SCE_KERNEL_ERROR_THREAD_TERMINATED, "helper deleted"); + if (entry_) + kernelMemory.Free(entry_); } void HLEHelperThread::AllocEntry(u32 size) { @@ -84,3 +86,8 @@ void HLEHelperThread::Terminate() { bool HLEHelperThread::Stopped() { return KernelIsThreadDormant(id_); } + +void HLEHelperThread::Forget() { + id_ = 0; + entry_ = 0; +} diff --git a/Core/HLE/HLEHelperThread.h b/Core/HLE/HLEHelperThread.h index 7b00466fe7..d7820bc20e 100644 --- a/Core/HLE/HLEHelperThread.h +++ b/Core/HLE/HLEHelperThread.h @@ -33,6 +33,9 @@ public: void Terminate(); bool Stopped(); + // For savestates. + void Forget(); + private: void AllocEntry(u32 size); void Create(const char *threadName, u32 prio, int stacksize); diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 6a12e7510a..c3a1bd2747 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -543,15 +543,23 @@ void PsmfPlayer::DoState(PointerWrap &p) { } p.Do(psmfPlayerAvcAu); if (s >= 7) { - bool hasFinishThread = finishThread != NULL; + bool hasFinishThread = finishThread != nullptr; p.Do(hasFinishThread); if (hasFinishThread) { p.Do(finishThread); + } else { + if (finishThread) + finishThread->Forget(); + delete finishThread; + finishThread = nullptr; } } else if (s >= 6) { p.Do(finishThread); } else { - finishThread = NULL; + if (finishThread) + finishThread->Forget(); + delete finishThread; + finishThread = nullptr; } if (s >= 8) {