From 9ba0ed46fded26e67ed95cb0df10ffff6a486aeb Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 23 Dec 2012 21:27:26 -0800 Subject: [PATCH] Always create CoreTiming timers during kernel init. --- Core/HLE/sceCtrl.cpp | 23 ++++++++--------------- Core/HLE/sceKernel.cpp | 6 +++++- Core/HLE/sceKernelAlarm.cpp | 20 ++++++-------------- Core/HLE/sceKernelAlarm.h | 4 +++- Core/HLE/sceKernelEventFlag.cpp | 5 ----- Core/HLE/sceKernelEventFlag.h | 2 ++ Core/HLE/sceKernelMbx.cpp | 8 +------- Core/HLE/sceKernelMbx.h | 2 ++ Core/HLE/sceKernelMutex.cpp | 6 +++--- Core/HLE/sceKernelSemaphore.cpp | 7 +------ Core/HLE/sceKernelSemaphore.h | 2 ++ Core/HLE/sceKernelThread.cpp | 1 + Core/HLE/sceUmd.cpp | 8 ++++---- 13 files changed, 38 insertions(+), 56 deletions(-) diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index ac85a3f1a8..d47cea7df8 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -62,7 +62,6 @@ struct CtrlLatch { ////////////////////////////////////////////////////////////////////////// // STATE BEGIN -static bool ctrlInited = false; static bool analogEnabled = false; static int ctrlLatchBufs = 0; static u32 ctrlOldButtons = 0; @@ -259,13 +258,15 @@ void __CtrlTimerUpdate(u64 userdata, int cyclesLate) void __CtrlInit() { - std::lock_guard guard(ctrlMutex); + ctrlTimer = CoreTiming::RegisterEvent("CtrlSampleTimer", __CtrlTimerUpdate); + __DisplayListenVblank(__CtrlVblank); + waitingThreads.clear(); - if (!ctrlInited) - { - __DisplayListenVblank(__CtrlVblank); - ctrlInited = true; - } + ctrlIdleReset = -1; + ctrlIdleBack = -1; + ctrlCycle = 0; + + std::lock_guard guard(ctrlMutex); ctrlBuf = 1; ctrlBufRead = 0; @@ -282,14 +283,6 @@ void __CtrlInit() for (int i = 0; i < NUM_CTRL_BUFFERS; i++) memcpy(&ctrlBufs[i], &ctrlCurrent, sizeof(_ctrl_data)); - - ctrlIdleReset = -1; - ctrlIdleBack = -1; - ctrlCycle = 0; - - waitingThreads.clear(); - - ctrlTimer = CoreTiming::RegisterEvent("CtrlSampleTimer", __CtrlTimerUpdate); } u32 sceCtrlSetSamplingCycle(u32 cycle) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index d4a34dc894..92b0c192f1 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -78,6 +78,10 @@ void __KernelInit() __KernelMemoryInit(); __KernelThreadingInit(); __KernelMutexInit(); + __KernelSemaInit(); + __KernelAlarmInit(); + __KernelEventFlagInit(); + __KernelMbxInit(); __IoInit(); __AudioInit(); __SasInit(); @@ -115,8 +119,8 @@ void __KernelShutdown() __AudioShutdown(); __IoShutdown(); __InterruptsShutdown(); - __KernelThreadingShutdown(); __KernelMutexShutdown(); + __KernelThreadingShutdown(); __KernelMemoryShutdown(); CoreTiming::ClearPendingEvents(); diff --git a/Core/HLE/sceKernelAlarm.cpp b/Core/HLE/sceKernelAlarm.cpp index 984c558e04..4e378b2a49 100644 --- a/Core/HLE/sceKernelAlarm.cpp +++ b/Core/HLE/sceKernelAlarm.cpp @@ -78,17 +78,7 @@ public: Alarm *alarm; }; -bool alarmInitComplete = false; -int alarmTimer = 0; - -void __KernelTriggerAlarm(u64 userdata, int cyclesLate); - -void __KernelAlarmInit() -{ - alarmTimer = CoreTiming::RegisterEvent("Alarm", __KernelTriggerAlarm); - - alarmInitComplete = true; -} +static int alarmTimer = 0; void __KernelTriggerAlarm(u64 userdata, int cyclesLate) { @@ -100,6 +90,11 @@ void __KernelTriggerAlarm(u64 userdata, int cyclesLate) __TriggerInterrupt(PSP_INTR_IMMEDIATE, PSP_SYSTIMER0_INTR, uid); } +void __KernelAlarmInit() +{ + alarmTimer = CoreTiming::RegisterEvent("Alarm", __KernelTriggerAlarm); +} + void __KernelScheduleAlarm(Alarm *alarm, u64 ticks) { alarm->alm.schedule = (CoreTiming::GetTicks() + ticks) / (u64) CoreTiming::GetClockFrequencyMHz(); @@ -108,9 +103,6 @@ void __KernelScheduleAlarm(Alarm *alarm, u64 ticks) SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr) { - if (!alarmInitComplete) - __KernelAlarmInit(); - if (!Memory::IsValidAddress(handlerPtr)) return SCE_KERNEL_ERROR_ILLEGAL_ADDR; diff --git a/Core/HLE/sceKernelAlarm.h b/Core/HLE/sceKernelAlarm.h index f430a20da9..09dd2e2f82 100644 --- a/Core/HLE/sceKernelAlarm.h +++ b/Core/HLE/sceKernelAlarm.h @@ -20,4 +20,6 @@ SceUID sceKernelSetAlarm(SceUInt clock, u32 handlerPtr, u32 commonPtr); SceUID sceKernelSetSysClockAlarm(u32 sysClockPtr, u32 handlerPtr, u32 commonPtr); int sceKernelCancelAlarm(SceUID uid); -int sceKernelReferAlarmStatus(SceUID uid, u32 infoPtr); \ No newline at end of file +int sceKernelReferAlarmStatus(SceUID uid, u32 infoPtr); + +void __KernelAlarmInit(); diff --git a/Core/HLE/sceKernelEventFlag.cpp b/Core/HLE/sceKernelEventFlag.cpp index ed237a1e25..a28c06c0d6 100644 --- a/Core/HLE/sceKernelEventFlag.cpp +++ b/Core/HLE/sceKernelEventFlag.cpp @@ -90,13 +90,11 @@ enum PspEventFlagWaitTypes PSP_EVENT_WAITKNOWN = PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITCLEARALL | PSP_EVENT_WAITOR, }; -bool eventFlagInitComplete = false; int eventFlagWaitTimer = 0; void __KernelEventFlagInit() { eventFlagWaitTimer = CoreTiming::RegisterEvent("EventFlagTimeout", &__KernelEventFlagTimeout); - eventFlagInitComplete = true; } bool __KernelEventFlagMatches(u32 *pattern, u32 bits, u8 wait, u32 outAddr) @@ -168,9 +166,6 @@ bool __KernelClearEventFlagThreads(EventFlag *e, int reason) //SceUID sceKernelCreateEventFlag(const char *name, int attr, int bits, SceKernelEventFlagOptParam *opt); int sceKernelCreateEventFlag(const char *name, u32 flag_attr, u32 flag_initPattern, u32 optPtr) { - if (!eventFlagInitComplete) - __KernelEventFlagInit(); - if (!name) { WARN_LOG(HLE, "%08x=sceKernelCreateEventFlag(): invalid name", SCE_KERNEL_ERROR_ERROR); diff --git a/Core/HLE/sceKernelEventFlag.h b/Core/HLE/sceKernelEventFlag.h index b47b43c53b..4243b8d897 100644 --- a/Core/HLE/sceKernelEventFlag.h +++ b/Core/HLE/sceKernelEventFlag.h @@ -26,3 +26,5 @@ int sceKernelWaitEventFlagCB(SceUID id, u32 bits, u32 wait, u32 outBitsPtr, u32 int sceKernelPollEventFlag(SceUID id, u32 bits, u32 wait, u32 outBitsPtr, u32 timeoutPtr); u32 sceKernelReferEventFlagStatus(SceUID id, u32 statusPtr); u32 sceKernelCancelEventFlag(SceUID uid, u32 pattern, u32 numWaitThreadsPtr); + +void __KernelEventFlagInit(); diff --git a/Core/HLE/sceKernelMbx.cpp b/Core/HLE/sceKernelMbx.cpp index bcd3b74d84..c8c758a215 100644 --- a/Core/HLE/sceKernelMbx.cpp +++ b/Core/HLE/sceKernelMbx.cpp @@ -30,8 +30,7 @@ const int PSP_MBX_ERROR_DUPLICATE_MSG = 0x800201C9; typedef std::pair MbxWaitingThread; void __KernelMbxTimeout(u64 userdata, int cyclesLate); -bool mbxInitComplete = false; -int mbxWaitTimer = 0; +static int mbxWaitTimer = 0; struct NativeMbx { @@ -162,8 +161,6 @@ struct Mbx : public KernelObject void __KernelMbxInit() { mbxWaitTimer = CoreTiming::RegisterEvent("MbxTimeout", &__KernelMbxTimeout); - - mbxInitComplete = true; } bool __KernelUnlockMbxForThread(Mbx *m, MbxWaitingThread &th, u32 &error, int result, bool &wokeThreads) @@ -263,9 +260,6 @@ std::vector::iterator __KernelMbxFindPriority(std::vector waitingThreads; }; -int mutexWaitTimer = 0; -int lwMutexWaitTimer = 0; +static int mutexWaitTimer = 0; +static int lwMutexWaitTimer = 0; // Thread -> Mutex locks for thread end. typedef std::multimap MutexMap; -MutexMap mutexHeldLocks; +static MutexMap mutexHeldLocks; void __KernelMutexInit() { diff --git a/Core/HLE/sceKernelSemaphore.cpp b/Core/HLE/sceKernelSemaphore.cpp index 5b9bdd3d7a..39dc209928 100644 --- a/Core/HLE/sceKernelSemaphore.cpp +++ b/Core/HLE/sceKernelSemaphore.cpp @@ -61,13 +61,11 @@ struct Semaphore : public KernelObject std::vector waitingThreads; }; -bool semaInitComplete = false; -int semaWaitTimer = 0; +static int semaWaitTimer = 0; void __KernelSemaInit() { semaWaitTimer = CoreTiming::RegisterEvent("SemaphoreTimeout", &__KernelSemaTimeout); - semaInitComplete = true; } // Returns whether the thread should be removed. @@ -173,9 +171,6 @@ int sceKernelCancelSema(SceUID id, int newCount, u32 numWaitThreadsPtr) //SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option); int sceKernelCreateSema(const char* name, u32 attr, int initVal, int maxVal, u32 optionPtr) { - if (!semaInitComplete) - __KernelSemaInit(); - if (!name) { WARN_LOG(HLE, "%08x=sceKernelCreateSema(): invalid name", SCE_KERNEL_ERROR_ERROR); diff --git a/Core/HLE/sceKernelSemaphore.h b/Core/HLE/sceKernelSemaphore.h index 32150c6307..9a8b9f2640 100644 --- a/Core/HLE/sceKernelSemaphore.h +++ b/Core/HLE/sceKernelSemaphore.h @@ -27,3 +27,5 @@ int sceKernelWaitSema(SceUID semaid, int signal, u32 timeoutPtr); int sceKernelWaitSemaCB(SceUID semaid, int signal, u32 timeoutPtr); void __KernelSemaTimeout(u64 userdata, int cycleslate); + +void __KernelSemaInit(); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 6807fd92d2..fed0a7fa11 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -435,6 +435,7 @@ void __KernelThreadingShutdown() { kernelMemory.Free(threadReturnHackAddr); threadqueue.clear(); + threadEndListeners.clear(); threadReturnHackAddr = 0; cbReturnHackAddr = 0; currentThread = 0; diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index a4fd3b8b11..3e358d36a3 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -47,8 +47,11 @@ struct PspUmdInfo { u32 type; }; +void __UmdStatTimeout(u64 userdata, int cyclesLate); -void __UmdInit() { +void __UmdInit() +{ + umdStatTimer = CoreTiming::RegisterEvent("UmdTimeout", &__UmdStatTimeout); umdActivated = 1; umdStatus = 0; umdErrorStat = 0; @@ -214,9 +217,6 @@ void __UmdStatTimeout(u64 userdata, int cyclesLate) void __UmdWaitStat(u32 timeout) { - if (umdStatTimer == 0) - umdStatTimer = CoreTiming::RegisterEvent("UmdTimeout", &__UmdStatTimeout); - // This happens to be how the hardware seems to time things. if (timeout <= 4) timeout = 15;