1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <atomic> 11 12 // struct atomic_flag 13 14 // bool test_and_set(memory_order = memory_order_seq_cst); 15 // bool test_and_set(memory_order = memory_order_seq_cst) volatile; 16 17 #include <atomic> 18 #include <cassert> 19 20 int main() 21 { 22 { 23 std::atomic_flag f; 24 f.clear(); 25 assert(f.test_and_set() == 0); 26 assert(f.test_and_set() == 1); 27 } 28 { 29 std::atomic_flag f; 30 f.clear(); 31 assert(f.test_and_set(std::memory_order_relaxed) == 0); 32 assert(f.test_and_set(std::memory_order_relaxed) == 1); 33 } 34 { 35 std::atomic_flag f; 36 f.clear(); 37 assert(f.test_and_set(std::memory_order_consume) == 0); 38 assert(f.test_and_set(std::memory_order_consume) == 1); 39 } 40 { 41 std::atomic_flag f; 42 f.clear(); 43 assert(f.test_and_set(std::memory_order_acquire) == 0); 44 assert(f.test_and_set(std::memory_order_acquire) == 1); 45 } 46 { 47 std::atomic_flag f; 48 f.clear(); 49 assert(f.test_and_set(std::memory_order_release) == 0); 50 assert(f.test_and_set(std::memory_order_release) == 1); 51 } 52 { 53 std::atomic_flag f; 54 f.clear(); 55 assert(f.test_and_set(std::memory_order_acq_rel) == 0); 56 assert(f.test_and_set(std::memory_order_acq_rel) == 1); 57 } 58 { 59 std::atomic_flag f; 60 f.clear(); 61 assert(f.test_and_set(std::memory_order_seq_cst) == 0); 62 assert(f.test_and_set(std::memory_order_seq_cst) == 1); 63 } 64 { 65 volatile std::atomic_flag f; 66 f.clear(); 67 assert(f.test_and_set() == 0); 68 assert(f.test_and_set() == 1); 69 } 70 { 71 volatile std::atomic_flag f; 72 f.clear(); 73 assert(f.test_and_set(std::memory_order_relaxed) == 0); 74 assert(f.test_and_set(std::memory_order_relaxed) == 1); 75 } 76 { 77 volatile std::atomic_flag f; 78 f.clear(); 79 assert(f.test_and_set(std::memory_order_consume) == 0); 80 assert(f.test_and_set(std::memory_order_consume) == 1); 81 } 82 { 83 volatile std::atomic_flag f; 84 f.clear(); 85 assert(f.test_and_set(std::memory_order_acquire) == 0); 86 assert(f.test_and_set(std::memory_order_acquire) == 1); 87 } 88 { 89 volatile std::atomic_flag f; 90 f.clear(); 91 assert(f.test_and_set(std::memory_order_release) == 0); 92 assert(f.test_and_set(std::memory_order_release) == 1); 93 } 94 { 95 volatile std::atomic_flag f; 96 f.clear(); 97 assert(f.test_and_set(std::memory_order_acq_rel) == 0); 98 assert(f.test_and_set(std::memory_order_acq_rel) == 1); 99 } 100 { 101 volatile std::atomic_flag f; 102 f.clear(); 103 assert(f.test_and_set(std::memory_order_seq_cst) == 0); 104 assert(f.test_and_set(std::memory_order_seq_cst) == 1); 105 } 106 } 107