mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-04 05:51:27 +12:00
Fix spurious abort in sys_rwlock_tryrlock and sys_semaphore_trywait (#5579)
Use full cmpxchg loop to prevent occasional return of CELL_EBUSY
This commit is contained in:
parent
d5eda98e49
commit
afeacc171f
2 changed files with 8 additions and 17 deletions
|
@ -169,19 +169,20 @@ error_code sys_rwlock_tryrlock(u32 rw_lock_id)
|
||||||
|
|
||||||
const auto rwlock = idm::check<lv2_obj, lv2_rwlock>(rw_lock_id, [](lv2_rwlock& rwlock)
|
const auto rwlock = idm::check<lv2_obj, lv2_rwlock>(rw_lock_id, [](lv2_rwlock& rwlock)
|
||||||
{
|
{
|
||||||
const s64 val = rwlock.owner;
|
auto [_, ok] = rwlock.owner.fetch_op([](s64& val)
|
||||||
|
{
|
||||||
if (val <= 0 && !(val & 1))
|
if (val <= 0 && !(val & 1))
|
||||||
{
|
{
|
||||||
if (rwlock.owner.compare_and_swap_test(val, val - 2))
|
val -= 2;
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
});
|
||||||
|
|
||||||
if (!rwlock)
|
if (!rwlock)
|
||||||
{
|
{
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
|
|
|
@ -171,17 +171,7 @@ error_code sys_semaphore_trywait(u32 sem_id)
|
||||||
|
|
||||||
const auto sem = idm::check<lv2_obj, lv2_sema>(sem_id, [&](lv2_sema& sema)
|
const auto sem = idm::check<lv2_obj, lv2_sema>(sem_id, [&](lv2_sema& sema)
|
||||||
{
|
{
|
||||||
const s32 val = sema.val;
|
return sema.val.try_dec(0);
|
||||||
|
|
||||||
if (val > 0)
|
|
||||||
{
|
|
||||||
if (sema.val.compare_and_swap_test(val, val - 1))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!sem)
|
if (!sem)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue