comparison DEPENDENCIES/generic/include/boost/atomic/detail/ops_emulated.hpp @ 102:f46d142149f5

Whoops, finish that update
author Chris Cannam
date Mon, 07 Sep 2015 11:13:41 +0100
parents
children
comparison
equal deleted inserted replaced
101:c530137014c0 102:f46d142149f5
1 /*
2 * Distributed under the Boost Software License, Version 1.0.
3 * (See accompanying file LICENSE_1_0.txt or copy at
4 * http://www.boost.org/LICENSE_1_0.txt)
5 *
6 * Copyright (c) 2014 Andrey Semashev
7 */
8 /*!
9 * \file atomic/detail/ops_emulated.hpp
10 *
11 * This header contains lockpool-based implementation of the \c operations template.
12 */
13
14 #ifndef BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
15 #define BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
16
17 #include <boost/memory_order.hpp>
18 #include <boost/atomic/detail/config.hpp>
19 #include <boost/atomic/detail/storage_type.hpp>
20 #include <boost/atomic/detail/operations_fwd.hpp>
21 #include <boost/atomic/detail/lockpool.hpp>
22 #include <boost/atomic/capabilities.hpp>
23
24 #ifdef BOOST_HAS_PRAGMA_ONCE
25 #pragma once
26 #endif
27
28 namespace boost {
29 namespace atomics {
30 namespace detail {
31
32 template< typename T >
33 struct emulated_operations
34 {
35 typedef T storage_type;
36
37 static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
38 {
39 lockpool::scoped_lock lock(&storage);
40 const_cast< storage_type& >(storage) = v;
41 }
42
43 static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
44 {
45 lockpool::scoped_lock lock(&storage);
46 return const_cast< storage_type const& >(storage);
47 }
48
49 static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
50 {
51 storage_type& s = const_cast< storage_type& >(storage);
52 lockpool::scoped_lock lock(&storage);
53 storage_type old_val = s;
54 s += v;
55 return old_val;
56 }
57
58 static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
59 {
60 storage_type& s = const_cast< storage_type& >(storage);
61 lockpool::scoped_lock lock(&storage);
62 storage_type old_val = s;
63 s -= v;
64 return old_val;
65 }
66
67 static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
68 {
69 storage_type& s = const_cast< storage_type& >(storage);
70 lockpool::scoped_lock lock(&storage);
71 storage_type old_val = s;
72 s = v;
73 return old_val;
74 }
75
76 static BOOST_FORCEINLINE bool compare_exchange_strong(
77 storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
78 {
79 storage_type& s = const_cast< storage_type& >(storage);
80 lockpool::scoped_lock lock(&storage);
81 storage_type old_val = s;
82 const bool res = old_val == expected;
83 if (res)
84 s = desired;
85 expected = old_val;
86
87 return res;
88 }
89
90 static BOOST_FORCEINLINE bool compare_exchange_weak(
91 storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
92 {
93 return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
94 }
95
96 static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
97 {
98 storage_type& s = const_cast< storage_type& >(storage);
99 lockpool::scoped_lock lock(&storage);
100 storage_type old_val = s;
101 s &= v;
102 return old_val;
103 }
104
105 static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
106 {
107 storage_type& s = const_cast< storage_type& >(storage);
108 lockpool::scoped_lock lock(&storage);
109 storage_type old_val = s;
110 s |= v;
111 return old_val;
112 }
113
114 static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
115 {
116 storage_type& s = const_cast< storage_type& >(storage);
117 lockpool::scoped_lock lock(&storage);
118 storage_type old_val = s;
119 s ^= v;
120 return old_val;
121 }
122
123 static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
124 {
125 return !!exchange(storage, (storage_type)1, order);
126 }
127
128 static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
129 {
130 store(storage, (storage_type)0, order);
131 }
132
133 static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
134 {
135 return false;
136 }
137 };
138
139 template< unsigned int Size, bool Signed >
140 struct operations :
141 public emulated_operations< typename make_storage_type< Size, Signed >::type >
142 {
143 };
144
145 } // namespace detail
146 } // namespace atomics
147 } // namespace boost
148
149 #endif // BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_