mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-15 11:18:36 +12:00
Fix sys_rwlock_wlock
This commit is contained in:
parent
dbd69536ed
commit
5766fb1f31
1 changed files with 6 additions and 7 deletions
|
@ -260,7 +260,7 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
|
||||||
{
|
{
|
||||||
sys_rwlock.trace("sys_rwlock_wlock(rw_lock_id=0x%x, timeout=0x%llx)", rw_lock_id, timeout);
|
sys_rwlock.trace("sys_rwlock_wlock(rw_lock_id=0x%x, timeout=0x%llx)", rw_lock_id, timeout);
|
||||||
|
|
||||||
const auto rwlock = idm::get<lv2_obj, lv2_rwlock>(rw_lock_id, [&](lv2_rwlock& rwlock)
|
const auto rwlock = idm::get<lv2_obj, lv2_rwlock>(rw_lock_id, [&](lv2_rwlock& rwlock) -> s64
|
||||||
{
|
{
|
||||||
const s64 val = rwlock.owner;
|
const s64 val = rwlock.owner;
|
||||||
|
|
||||||
|
@ -268,12 +268,12 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
|
||||||
{
|
{
|
||||||
if (rwlock.owner.compare_and_swap_test(0, ppu.id << 1))
|
if (rwlock.owner.compare_and_swap_test(0, ppu.id << 1))
|
||||||
{
|
{
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (val >> 1 == ppu.id)
|
else if (val >> 1 == ppu.id)
|
||||||
{
|
{
|
||||||
return false;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
semaphore_lock lock(rwlock.mutex);
|
semaphore_lock lock(rwlock.mutex);
|
||||||
|
@ -294,10 +294,9 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
|
||||||
{
|
{
|
||||||
rwlock.wq.emplace_back(&ppu);
|
rwlock.wq.emplace_back(&ppu);
|
||||||
rwlock.sleep(ppu, timeout);
|
rwlock.sleep(ppu, timeout);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return _old;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!rwlock)
|
if (!rwlock)
|
||||||
|
@ -305,12 +304,12 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rwlock.ret)
|
if (rwlock.ret == 0)
|
||||||
{
|
{
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rwlock->owner >> 1 == ppu.id)
|
if (rwlock.ret >> 1 == ppu.id)
|
||||||
{
|
{
|
||||||
return CELL_EDEADLK;
|
return CELL_EDEADLK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue