diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 2013ee8b23..657977a0ca 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -195,7 +195,7 @@ const std::array s_ppu_syscall_table BIND_FUNC(sys_time_get_current_time), //145 (0x091) null_func,//BIND_FUNC(sys_time_get_system_time), //146 (0x092) ROOT BIND_FUNC(sys_time_get_timebase_frequency), //147 (0x093) - null_func,//BIND_FUNC(_sys_rwlock_trywlock) //148 (0x094) + BIND_FUNC(_sys_rwlock_trywlock), //148 (0x094) null_func, //149 (0x095) UNS BIND_FUNC(sys_raw_spu_create_interrupt_tag), //150 (0x096) BIND_FUNC(sys_raw_spu_set_int_mask), //151 (0x097) diff --git a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp index 79351653a9..0fe0fb36d1 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp @@ -225,9 +225,9 @@ error_code sys_rwlock_runlock(ppu_thread& ppu, u32 rw_lock_id) // Remove one reader const s64 _old = rwlock->owner.fetch_op([](s64& val) { - if (val < 0) + if (val < -1) { - val++; + val += 2; } }); diff --git a/rpcs3/Emu/Cell/lv2/sys_rwlock.h b/rpcs3/Emu/Cell/lv2/sys_rwlock.h index d99ba60e86..af53cf1819 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rwlock.h +++ b/rpcs3/Emu/Cell/lv2/sys_rwlock.h @@ -55,3 +55,5 @@ error_code sys_rwlock_runlock(ppu_thread& ppu, u32 rw_lock_id); error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout); error_code sys_rwlock_trywlock(ppu_thread& ppu, u32 rw_lock_id); error_code sys_rwlock_wunlock(ppu_thread& ppu, u32 rw_lock_id); + +constexpr auto _sys_rwlock_trywlock = sys_rwlock_trywlock;