diff --git a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h index 2ac483c257..a75d953064 100644 --- a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h +++ b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h @@ -24,6 +24,24 @@ s32 sys_lwmutex_trylock(ppu_thread& CPU, vm::ptr lwmutex); s32 sys_lwmutex_unlock(ppu_thread& CPU, vm::ptr lwmutex); s32 sys_lwmutex_destroy(ppu_thread& CPU, vm::ptr lwmutex); +struct sys_lwmutex_locker +{ + ppu_thread& ppu; + vm::ptr mutex; + + sys_lwmutex_locker(ppu_thread& ppu, vm::ptr mutex) + : ppu(ppu) + , mutex(mutex) + { + verify(HERE), sys_lwmutex_lock(ppu, mutex, 0) == CELL_OK; + } + + ~sys_lwmutex_locker() noexcept(false) + { + verify(HERE), sys_lwmutex_unlock(ppu, mutex) == CELL_OK; + } +}; + struct sys_lwcond_t; struct sys_lwcond_attribute_t; diff --git a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp index eef79a9c0e..0251652754 100644 --- a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp @@ -182,13 +182,12 @@ error_code sys_ppu_thread_register_atexit(ppu_thread& ppu, vm::ptr func) { sysPrxForUser.notice("sys_ppu_thread_register_atexit(ptr=*0x%x)", func); - verify(HERE), !sys_lwmutex_lock(ppu, g_ppu_atexit_lwm, 0); + sys_lwmutex_locker lock(ppu, g_ppu_atexit_lwm); for (auto ptr : *g_ppu_atexit) { if (ptr == func) { - verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm); return CELL_EPERM; } } @@ -198,12 +197,10 @@ error_code sys_ppu_thread_register_atexit(ppu_thread& ppu, vm::ptr func) if (pp == vm::null) { pp = func; - verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm); return CELL_OK; } } - verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm); return CELL_ENOMEM; } @@ -211,19 +208,17 @@ error_code sys_ppu_thread_unregister_atexit(ppu_thread& ppu, vm::ptr fun { sysPrxForUser.notice("sys_ppu_thread_unregister_atexit(ptr=*0x%x)", func); - verify(HERE), !sys_lwmutex_lock(ppu, g_ppu_atexit_lwm, 0); + sys_lwmutex_locker lock(ppu, g_ppu_atexit_lwm); for (auto& pp : *g_ppu_atexit) { if (pp == func) { pp = vm::null; - verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm); return CELL_OK; } } - verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm); return CELL_ESRCH; } @@ -231,7 +226,7 @@ void sys_ppu_thread_once(ppu_thread& ppu, vm::ptr once_ctrl, vm::ptr once_ctrl, vm::ptr