diff --git a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp index db1f892dea7b..c57066de8019 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp @@ -100,7 +100,11 @@ error_code sys_lwcond_signal(ppu_thread& ppu, vm::ptr lwcond) } // if locking succeeded - lwmutex->all_info++; + lwmutex->lock_var.atomic_op([](typename sys_lwmutex_t::sync_var_t& var) + { + var.waiter++; + var.owner = lwmutex_reserved; + }); // call the syscall if (error_code res = _sys_lwcond_signal(ppu, lwcond->lwcond_queue, lwmutex->sleep_queue, -1, 3)) @@ -110,7 +114,11 @@ error_code sys_lwcond_signal(ppu_thread& ppu, vm::ptr lwcond) return 0; } - lwmutex->all_info--; + lwmutex->lock_var.atomic_op([&](typename sys_lwmutex_t::sync_var_t& var) + { + var.waiter--; + var.owner = ppu.id; + }); // unlock the lightweight mutex sys_lwmutex_unlock(ppu, lwmutex); @@ -245,7 +253,11 @@ error_code sys_lwcond_signal_to(ppu_thread& ppu, vm::ptr lwcond, u } // if locking succeeded - lwmutex->all_info++; + lwmutex->lock_var.atomic_op([](typename sys_lwmutex_t::sync_var_t& var) + { + var.waiter++; + var.owner = lwmutex_reserved; + }); // call the syscall if (error_code res = _sys_lwcond_signal(ppu, lwcond->lwcond_queue, lwmutex->sleep_queue, ppu_thread_id, 3)) @@ -255,7 +267,11 @@ error_code sys_lwcond_signal_to(ppu_thread& ppu, vm::ptr lwcond, u return 0; } - lwmutex->all_info--; + lwmutex->lock_var.atomic_op([&](typename sys_lwmutex_t::sync_var_t& var) + { + var.waiter--; + var.owner = ppu.id; + }); // unlock the lightweight mutex sys_lwmutex_unlock(ppu, lwmutex); diff --git a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp index 7c0755e10c12..ea7ba4ce1ced 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp @@ -178,7 +178,7 @@ error_code sys_lwmutex_lock(ppu_thread& ppu, vm::ptr lwmutex, u64 // locking succeeded auto old = lwmutex->vars.owner.exchange(tid); - if (old != lwmutex_reserved && old >> 24 != 1) + if (old != lwmutex_reserved) { fmt::throw_exception("Locking failed (lwmutex=*0x%x, owner=0x%x)" HERE, lwmutex, old); } @@ -308,7 +308,7 @@ error_code sys_lwmutex_trylock(ppu_thread& ppu, vm::ptr lwmutex) // locking succeeded auto old = lwmutex->vars.owner.exchange(tid); - if (old != lwmutex_reserved && old >> 24 != 1) + if (old != lwmutex_reserved) { fmt::throw_exception("Locking failed (lwmutex=*0x%x, owner=0x%x)" HERE, lwmutex, old); }