|
10 | 10 |
|
11 | 11 | class SpinLockTestAndSet { |
12 | 12 | public: |
13 | | - void lock() { |
14 | | - while (lock_flag.test_and_set(std::memory_order_acquire)) { |
15 | | - // Busy-wait (spin) until the lock is acquired |
16 | | - } |
| 13 | + void lock() { |
| 14 | + while (lock_flag.test_and_set(std::memory_order_acquire)) { |
| 15 | + // Busy-wait (spin) until the lock is acquired |
17 | 16 | } |
| 17 | + } |
18 | 18 |
|
19 | | - void unlock() { |
20 | | - lock_flag.clear(std::memory_order_release); |
21 | | - } |
| 19 | + void unlock() { lock_flag.clear(std::memory_order_release); } |
22 | 20 |
|
23 | 21 | private: |
24 | | - std::atomic_flag lock_flag = ATOMIC_FLAG_INIT; |
| 22 | + std::atomic_flag lock_flag = ATOMIC_FLAG_INIT; |
25 | 23 | }; |
26 | 24 |
|
27 | 25 | class SpinLockCompareExchange { |
28 | 26 | public: |
29 | | - void lock() { |
30 | | - bool expected = false; |
31 | | - while (!lock_flag.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) { |
32 | | - } |
| 27 | + void lock() { |
| 28 | + bool expected = false; |
| 29 | + while (!lock_flag.compare_exchange_weak( |
| 30 | + expected, true, std::memory_order_acquire, std::memory_order_relaxed)) { |
33 | 31 | } |
| 32 | + } |
34 | 33 |
|
35 | | - void unlock() { |
36 | | - lock_flag.store(false, std::memory_order_release); |
37 | | - } |
| 34 | + void unlock() { lock_flag.store(false, std::memory_order_release); } |
38 | 35 |
|
39 | 36 | private: |
40 | | - std::atomic<bool> lock_flag{false}; |
| 37 | + std::atomic<bool> lock_flag{false}; |
41 | 38 | }; |
42 | 39 |
|
43 | | -int lock_violation() [[clang::nonblocking]] |
44 | | -{ |
| 40 | +int lock_violation() [[clang::nonblocking]] { |
45 | 41 | #if defined(TEST_AND_SET_SPINLOCK) |
46 | | - SpinLockTestAndSet lock; |
| 42 | + SpinLockTestAndSet lock; |
47 | 43 | #elif defined(CAS_SPINLOCK) |
48 | | - SpinLockCompareExchange lock; |
| 44 | + SpinLockCompareExchange lock; |
49 | 45 | #else |
50 | | -#error "No spinlock defined" |
| 46 | +# error "No spinlock defined" |
51 | 47 | #endif |
52 | | - lock.lock(); |
53 | | - return 0; |
| 48 | + lock.lock(); |
| 49 | + return 0; |
54 | 50 | } |
55 | 51 |
|
56 | | -int main() [[clang::nonblocking]] |
57 | | -{ |
58 | | - lock_violation(); |
59 | | -} |
| 52 | +int main() [[clang::nonblocking]] { lock_violation(); } |
60 | 53 |
|
61 | 54 | // CHECK-ALL: {{.*Real-time violation.*}} |
62 | 55 | // CHECK-CAS: {{.*SpinLockCompareExchange::lock.*}} |
|
0 commit comments