Prioritize vip_lock in shared_mutex

Should fix some deadlock issues.
This commit is contained in:
Nekotekina 2019-10-06 13:32:03 +03:00
parent 239f53568c
commit cf13dee1f3

View File

@ -122,14 +122,14 @@ public:
const u32 value = m_value.load(); const u32 value = m_value.load();
// Conditional increment // Conditional increment
return value < c_one - 1 && (value % c_vip) == 0 && m_value.compare_and_swap_test(value, value + c_vip); return (value < c_one - 1 || value & (c_one - c_vip)) && (value % c_vip) == 0 && m_value.compare_and_swap_test(value, value + c_vip);
} }
void lock_vip() void lock_vip()
{ {
const u32 value = m_value.load(); const u32 value = m_value.load();
if (UNLIKELY(value >= c_one - 1 || (value % c_vip) || !m_value.compare_and_swap_test(value, value + c_vip))) if (UNLIKELY((value >= c_one - 1 && !(value & (c_one - c_vip))) || (value % c_vip) || !m_value.compare_and_swap_test(value, value + c_vip)))
{ {
imp_lock_vip(value); imp_lock_vip(value);
} }