1
0
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:
Elad 2024-11-02 08:27:36 +02:00
parent 0e31aafc09
commit 1417f9b7de

View File

@ -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