mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-25 12:12:50 +01:00
utils/atomic.cpp: Fixup utils::get_unique_tsc()
It was reading s_min_tsc again inside the atomic operation. Also optimize it a bit.
This commit is contained in:
parent
0e31aafc09
commit
1417f9b7de
@ -674,19 +674,28 @@ u64 utils::get_unique_tsc()
|
|||||||
{
|
{
|
||||||
const u64 stamp0 = utils::get_tsc();
|
const u64 stamp0 = utils::get_tsc();
|
||||||
|
|
||||||
return s_min_tsc.atomic_op([&](u64& tsc)
|
if (!s_min_tsc.fetch_op([=](u64& tsc)
|
||||||
{
|
{
|
||||||
if (stamp0 <= s_min_tsc)
|
if (stamp0 <= tsc)
|
||||||
{
|
{
|
||||||
// Add 1 if new stamp is too old
|
// Add 1 if new stamp is too old
|
||||||
return ++tsc;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Update last tsc with new stamp otherwise
|
// Update last tsc with new stamp otherwise
|
||||||
return ((tsc = stamp0));
|
tsc = stamp0;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
}).second)
|
||||||
|
{
|
||||||
|
// Add 1 if new stamp is too old
|
||||||
|
// Avoid doing it in the atomic operaion because, if it gets here it means there is already much cntention
|
||||||
|
// So break the race (at least on x86)
|
||||||
|
return s_min_tsc.add_fetch(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stamp0;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_t<u16>* root_info::slot_alloc(uptr ptr) noexcept
|
atomic_t<u16>* root_info::slot_alloc(uptr ptr) noexcept
|
||||||
|
Loading…
Reference in New Issue
Block a user