]>
Commit | Line | Data |
---|---|---|
f20569fa XL |
1 | #![warn(clippy::invalid_atomic_ordering)] |
2 | ||
3 | use std::sync::atomic::{AtomicPtr, Ordering}; | |
4 | ||
5 | fn main() { | |
6 | let ptr = &mut 5; | |
7 | let ptr2 = &mut 10; | |
8 | // `compare_exchange_weak` testing | |
9 | let x = AtomicPtr::new(ptr); | |
10 | ||
11 | // Allowed ordering combos | |
12 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Relaxed); | |
13 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Acquire); | |
14 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Relaxed); | |
15 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Release, Ordering::Relaxed); | |
16 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Acquire); | |
17 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Relaxed); | |
18 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Relaxed); | |
19 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Acquire); | |
20 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::SeqCst); | |
21 | ||
22 | // AcqRel is always forbidden as a failure ordering | |
23 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Relaxed, Ordering::AcqRel); | |
24 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::AcqRel); | |
25 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::AcqRel); | |
26 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::AcqRel); | |
27 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::SeqCst, Ordering::AcqRel); | |
28 | ||
29 | // Release is always forbidden as a failure ordering | |
30 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Release); | |
31 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Release); | |
32 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Release, Ordering::Release); | |
33 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Release); | |
34 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Release); | |
35 | ||
36 | // Release success order forbids failure order of Acquire or SeqCst | |
37 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::Acquire); | |
38 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::SeqCst); | |
39 | ||
40 | // Relaxed success order also forbids failure order of Acquire or SeqCst | |
41 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::SeqCst); | |
42 | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Acquire); | |
43 | ||
44 | // Acquire/AcqRel forbids failure order of SeqCst | |
45 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::SeqCst); | |
46 | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::SeqCst); | |
47 | } |