mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-26 19:46:19 +00:00
Listen for shutdown in thread loops.
This way we don't need to use wait_for(), much better. Also because there are slightly more correct cond vars on win32.
This commit is contained in:
parent
4b9056fa02
commit
086294b495
@ -428,6 +428,10 @@ void __IoManagerThread() {
|
||||
}
|
||||
}
|
||||
|
||||
void __IoWakeManager() {
|
||||
ioManager.FinishEventLoop();
|
||||
}
|
||||
|
||||
void __IoInit() {
|
||||
INFO_LOG(SCEIO, "Starting up I/O...");
|
||||
|
||||
@ -458,6 +462,7 @@ void __IoInit() {
|
||||
ioManagerThreadEnabled = g_Config.bSeparateIOThread;
|
||||
ioManager.SetThreadEnabled(ioManagerThreadEnabled);
|
||||
if (ioManagerThreadEnabled) {
|
||||
Core_ListenShutdown(&__IoWakeManager);
|
||||
ioManagerThread = new std::thread(&__IoManagerThread);
|
||||
}
|
||||
|
||||
|
@ -124,7 +124,7 @@ bool CPU_HasPendingAction() {
|
||||
void CPU_WaitStatus(bool (*pred)()) {
|
||||
cpuThreadLock.lock();
|
||||
while (!pred())
|
||||
cpuThreadCond.wait_for(cpuThreadLock, 16);
|
||||
cpuThreadCond.wait(cpuThreadLock);
|
||||
cpuThreadLock.unlock();
|
||||
}
|
||||
|
||||
@ -255,6 +255,12 @@ void Core_UpdateState(CoreState newState) {
|
||||
Core_UpdateSingleStep();
|
||||
}
|
||||
|
||||
void System_Wake() {
|
||||
if (gpu) {
|
||||
gpu->FinishEventLoop();
|
||||
}
|
||||
}
|
||||
|
||||
bool PSP_Init(const CoreParameter &coreParam, std::string *error_string) {
|
||||
INFO_LOG(BOOT, "PPSSPP %s", PPSSPP_GIT_VERSION);
|
||||
|
||||
@ -262,6 +268,7 @@ bool PSP_Init(const CoreParameter &coreParam, std::string *error_string) {
|
||||
coreParameter.errorString = "";
|
||||
|
||||
if (g_Config.bSeparateCPUThread) {
|
||||
Core_ListenShutdown(System_Wake);
|
||||
CPU_SetState(CPU_THREAD_PENDING);
|
||||
cpuThread = new std::thread(&CPU_RunLoop);
|
||||
CPU_WaitStatus(&CPU_IsReady);
|
||||
@ -286,9 +293,9 @@ bool PSP_IsInited() {
|
||||
}
|
||||
|
||||
void PSP_Shutdown() {
|
||||
Core_NotifyShutdown();
|
||||
if (coreState == CORE_RUNNING)
|
||||
Core_UpdateState(CORE_ERROR);
|
||||
Core_NotifyShutdown();
|
||||
if (cpuThread != NULL) {
|
||||
CPU_SetState(CPU_THREAD_SHUTDOWN);
|
||||
CPU_WaitStatus(&CPU_IsShutdown);
|
||||
|
@ -81,7 +81,7 @@ struct ThreadEventQueue : public B {
|
||||
}
|
||||
|
||||
// coreState changes won't wake us, so recheck periodically.
|
||||
eventsWait_.wait_for(eventsWaitLock_, 1);
|
||||
eventsWait_.wait(eventsWaitLock_);
|
||||
} while (CoreTiming::GetTicks() < globalticks);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user