diff --git a/Core/HLE/HLEHelperThread.cpp b/Core/HLE/HLEHelperThread.cpp index 97b947ceab..a55e065d42 100644 --- a/Core/HLE/HLEHelperThread.cpp +++ b/Core/HLE/HLEHelperThread.cpp @@ -55,11 +55,12 @@ HLEHelperThread::~HLEHelperThread() { void HLEHelperThread::AllocEntry(u32 size) { entry_ = kernelMemory.Alloc(size); + Memory::Memset(entry_, 0, size); currentMIPS->InvalidateICache(entry_, size); } void HLEHelperThread::Create(const char *threadName, u32 prio, int stacksize) { - id_ = __KernelCreateThreadInternal(threadName, __KernelGetCurThreadModuleId(), entry_, prio, stacksize, 0); + id_ = __KernelCreateThreadInternal(threadName, __KernelGetCurThreadModuleId(), entry_, prio, stacksize, 0x00001000); } void HLEHelperThread::DoState(PointerWrap &p) { @@ -79,3 +80,7 @@ void HLEHelperThread::Start(u32 a0, u32 a1) { void HLEHelperThread::Terminate() { __KernelStopThread(id_, SCE_KERNEL_ERROR_THREAD_TERMINATED, "helper terminated"); } + +bool HLEHelperThread::Stopped() { + return KernelIsThreadDormant(id_); +} diff --git a/Core/HLE/HLEHelperThread.h b/Core/HLE/HLEHelperThread.h index db123b81f6..7b00466fe7 100644 --- a/Core/HLE/HLEHelperThread.h +++ b/Core/HLE/HLEHelperThread.h @@ -31,6 +31,7 @@ public: void Start(u32 a0, u32 a1); void Terminate(); + bool Stopped(); private: void AllocEntry(u32 size); @@ -38,4 +39,4 @@ private: SceUID id_; u32 entry_; -}; \ No newline at end of file +}; diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index a909cc3687..948bf9fb2d 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -399,8 +399,9 @@ public: static int GetStaticIDType() { return SCE_KERNEL_TMID_Thread; } int GetIDType() const override { return SCE_KERNEL_TMID_Thread; } - bool AllocateStack(u32 &stackSize) - { + bool AllocateStack(u32 &stackSize) { + _assert_msg_(SCEKERNEL, stackSize >= 0x200, "thread stack should be 256 bytes or larger"); + FreeStack(); bool fromTop = (nt.attr & PSP_THREAD_ATTR_LOW_STACK) == 0; @@ -1183,6 +1184,14 @@ const char *__KernelGetThreadName(SceUID threadID) return "ERROR"; } +bool KernelIsThreadDormant(SceUID threadID) { + u32 error; + Thread *t = kernelObjects.Get(threadID, error); + if (t) + return (t->nt.status & (THREADSTATUS_DEAD | THREADSTATUS_DORMANT)) != 0; + return 0; +} + u32 __KernelGetWaitValue(SceUID threadID, u32 &error) { Thread *t = kernelObjects.Get(threadID, error); @@ -2352,6 +2361,13 @@ SceUID __KernelGetCurThread() return currentThread; } +int KernelCurThreadPriority() { + Thread *t = __GetCurrentThread(); + if (t) + return t->nt.currentPriority; + return 0; +} + SceUID __KernelGetCurThreadModuleId() { Thread *t = __GetCurrentThread(); diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index a7a127f638..45b9387628 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -161,9 +161,11 @@ KernelObject *__KernelCallbackObject(); void __KernelScheduleWakeup(int threadnumber, s64 usFromNow); SceUID __KernelGetCurThread(); +int KernelCurThreadPriority(); u32 __KernelGetCurThreadStack(); u32 __KernelGetCurThreadStackStart(); const char *__KernelGetThreadName(SceUID threadID); +bool KernelIsThreadDormant(SceUID threadID); void __KernelSaveContext(ThreadContext *ctx, bool vfpuEnabled); void __KernelLoadContext(ThreadContext *ctx, bool vfpuEnabled); diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index e05ea4b3a4..6a12e7510a 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -220,7 +220,7 @@ public: void ScheduleFinish(u32 handle) { if (!finishThread) { - finishThread = new HLEHelperThread("scePsmfPlayer", "scePsmfPlayer", "__PsmfPlayerFinish", playbackThreadPriority, 0x100); + finishThread = new HLEHelperThread("scePsmfPlayer", "scePsmfPlayer", "__PsmfPlayerFinish", playbackThreadPriority, 0x200); finishThread->Start(handle, 0); } }