Replace compare_exchange with swap
This commit is contained in:
parent
5c5a5182c9
commit
f7ffe5bd24
@ -539,20 +539,15 @@ impl AtomicBool {
|
||||
// We can't use atomic_nand here because it can result in a bool with
|
||||
// an invalid value. This happens because the atomic operation is done
|
||||
// with an 8-bit integer internally, which would set the upper 7 bits.
|
||||
// So we just use fetch_xor or compare_exchange instead.
|
||||
// So we just use fetch_xor or swap instead.
|
||||
if val {
|
||||
// !(x & true) == !x
|
||||
// We must invert the bool.
|
||||
self.fetch_xor(true, order)
|
||||
} else {
|
||||
// !(x & false) == true
|
||||
// We must set the bool to true. Instead of delegating to swap or fetch_or, use
|
||||
// compare_exchange instead in order to avoid unnecessary writes to memory, which
|
||||
// might minimize cache-coherence traffic.
|
||||
match self.compare_exchange(false, true, order, Ordering::Relaxed) {
|
||||
Ok(_) => false,
|
||||
Err(_) => true,
|
||||
}
|
||||
// We must set the bool to true.
|
||||
self.swap(true, order)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user