14 : fBarrierFlag_{barrier}
17 inline bool SpinLock::try_lock ()
27 bool result = not fLock_.test_and_set (memory_order_acquire);
29 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wtsan\"");
33 switch (fBarrierFlag_) {
34 case BarrierType::eReleaseAcquire:
35 atomic_thread_fence (memory_order_acquire);
37 case BarrierType::eMemoryTotalOrder:
38 atomic_thread_fence (memory_order_seq_cst);
43 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wtsan\"");
47 inline void SpinLock::lock ()
50 while (not try_lock ()) {
51 this_thread::yield ();
54 inline void SpinLock::unlock ()
57 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wtsan\"");
58 switch (fBarrierFlag_) {
59 case BarrierType::eReleaseAcquire:
60 atomic_thread_fence (memory_order_release);
62 case BarrierType::eMemoryTotalOrder:
63 atomic_thread_fence (memory_order_seq_cst);
68 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wtsan\"");
70 fLock_.clear (memory_order_release);
SpinLock(BarrierType barrier=BarrierType::eDEFAULT)