]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/config/test/boost_no_cxx11_hdr_atomic.ipp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / config / test / boost_no_cxx11_hdr_atomic.ipp
1 // (C) Copyright John Maddock 2013
2
3 // Use, modification and distribution are subject to the
4 // Boost Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7 // See http://www.boost.org/libs/config for more information.
8
9 // MACRO: BOOST_NO_CXX11_HDR_ATOMIC
10 // TITLE: C++11 <atomic> header is either not present or too broken to be used
11 // DESCRIPTION: The compiler does not support the C++11 header <atomic>
12
13 #include <atomic>
14
15 #if !defined(ATOMIC_BOOL_LOCK_FREE) || !defined(ATOMIC_CHAR_LOCK_FREE) || !defined(ATOMIC_CHAR16_T_LOCK_FREE) \
16 || !defined(ATOMIC_CHAR32_T_LOCK_FREE) || !defined(ATOMIC_WCHAR_T_LOCK_FREE) || !defined(ATOMIC_SHORT_LOCK_FREE)\
17 || !defined(ATOMIC_INT_LOCK_FREE) || !defined(ATOMIC_LONG_LOCK_FREE) || !defined(ATOMIC_LLONG_LOCK_FREE)\
18 || !defined(ATOMIC_POINTER_LOCK_FREE)
19 # error "required macros not defined"
20 #endif
21
22 namespace boost_no_cxx11_hdr_atomic {
23
24 void consume(std::memory_order)
25 {}
26
27 int test()
28 {
29 consume(std::memory_order_relaxed);
30 consume(std::memory_order_consume);
31 consume(std::memory_order_acquire);
32 consume(std::memory_order_release);
33 consume(std::memory_order_acq_rel);
34 consume(std::memory_order_seq_cst);
35
36 std::atomic<int> a1;
37 std::atomic<unsigned> a2;
38 std::atomic<int*> a3;
39 a1.is_lock_free();
40 a1.store(1);
41 a1.load();
42 a1.exchange(2);
43 int v;
44 a1.compare_exchange_weak(v, 2, std::memory_order_relaxed, std::memory_order_relaxed);
45 a1.compare_exchange_strong(v, 2, std::memory_order_relaxed, std::memory_order_relaxed);
46 a1.fetch_add(2);
47 a1.fetch_sub(3);
48 a1.fetch_and(3);
49 a1.fetch_or(1);
50 a1.fetch_xor(1);
51 a1++;
52 ++a1;
53 a1--;
54 --a1;
55 a1 += 2;
56 a1 -= 2;
57 a1 &= 1;
58 a1 |= 2;
59 a1 ^= 3;
60
61 a2 = 0u;
62
63 a3.store(&v);
64 a3.fetch_add(1);
65 a3.fetch_sub(1);
66 ++a3;
67 --a3;
68 a3++;
69 a3--;
70 a3 += 1;
71 a3 -= 1;
72
73 std::atomic_is_lock_free(&a1);
74 // This produces linker errors on Mingw32 for some reason, probably not required anyway for most uses??
75 //std::atomic_init(&a1, 2);
76 std::atomic_store(&a1, 3);
77 std::atomic_store_explicit(&a1, 3, std::memory_order_relaxed);
78 std::atomic_load(&a1);
79 std::atomic_load_explicit(&a1, std::memory_order_relaxed);
80 std::atomic_exchange(&a1, 3);
81 std::atomic_compare_exchange_weak(&a1, &v, 2);
82 std::atomic_compare_exchange_strong(&a1, &v, 2);
83 std::atomic_compare_exchange_weak_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed);
84 std::atomic_compare_exchange_strong_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed);
85
86 std::atomic_flag f = ATOMIC_FLAG_INIT;
87 f.test_and_set(std::memory_order_relaxed);
88 f.test_and_set();
89 f.clear(std::memory_order_relaxed);
90 f.clear();
91
92 std::atomic_thread_fence(std::memory_order_relaxed);
93 std::atomic_signal_fence(std::memory_order_relaxed);
94
95 return 0;
96 }
97
98 }