Krita Source Code Documentation
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1/*------------------------------------------------------------------------
2 Junction: Concurrent data structures in C++
3 Copyright (c) 2016 Jeff Preshing
4 Distributed under the Simplified BSD License.
5 Original location: https://github.com/preshing/junction
6 This software is distributed WITHOUT ANY WARRANTY; without even the
7 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8 See the LICENSE file for more information.
9------------------------------------------------------------------------*/
10
11#ifndef ATOMIC_H
12#define ATOMIC_H
13
14#include <atomic>
15
16inline void signalFenceConsume()
17{
18 std::atomic_signal_fence(std::memory_order_acquire);
19}
20
21inline void signalFenceAcquire()
22{
23 std::atomic_signal_fence(std::memory_order_acquire);
24}
25
26inline void signalFenceRelease()
27{
28 std::atomic_signal_fence(std::memory_order_release);
29}
30
31inline void signalFenceSeqCst()
32{
33 std::atomic_signal_fence(std::memory_order_seq_cst);
34}
35
36inline void threadFenceConsume()
37{
38 std::atomic_thread_fence(std::memory_order_acquire);
39}
40
41inline void threadFenceAcquire()
42{
43 std::atomic_thread_fence(std::memory_order_acquire);
44}
45
46inline void threadFenceRelease()
47{
48 std::atomic_thread_fence(std::memory_order_release);
49}
50
51inline void threadFenceSeqCst()
52{
53 std::atomic_thread_fence(std::memory_order_seq_cst);
54}
55
57 Relaxed = std::memory_order_relaxed,
58 Consume = std::memory_order_consume,
59 Acquire = std::memory_order_acquire,
60 Release = std::memory_order_release,
61 ConsumeRelease = std::memory_order_acq_rel,
62 AcquireRelease = std::memory_order_acq_rel,
63};
64
65template <typename T>
66class Atomic : protected std::atomic<T>
67{
68private:
70
71public:
73 {
74 }
75
76 Atomic(T value) : std::atomic<T>(value)
77 {
78 }
79
80 Atomic(const Atomic& other) : std::atomic<T>(other.loadNonatomic())
81 {
82 }
83
84 T loadNonatomic() const
85 {
86 return std::atomic<T>::load(std::memory_order_relaxed);
87 }
88
89 T load(MemoryOrder memoryOrder) const
90 {
91 return std::atomic<T>::load((std::memory_order) memoryOrder);
92 }
93
95 {
96 return std::atomic<T>::store(value, std::memory_order_relaxed);
97 }
98
99 void store(T value, MemoryOrder memoryOrder)
100 {
101 return std::atomic<T>::store(value, (std::memory_order) memoryOrder);
102 }
103
104 T compareExchange(T expected, T desired, MemoryOrder memoryOrder)
105 {
106 std::atomic<T>::compare_exchange_strong(expected, desired, (std::memory_order) memoryOrder);
107 return expected; // modified by reference by compare_exchange_strong
108 }
109
110 bool compareExchangeStrong(T& expected, T desired, MemoryOrder memoryOrder)
111 {
112 return std::atomic<T>::compare_exchange_strong(expected, desired, (std::memory_order) memoryOrder);
113 }
114
115 bool compareExchangeWeak(T& expected, T desired, MemoryOrder success, MemoryOrder failure)
116 {
117 return std::atomic<T>::compare_exchange_weak(expected, desired, (std::memory_order) success, (std::memory_order) failure);
118 }
119
120 T exchange(T desired, MemoryOrder memoryOrder)
121 {
122 return std::atomic<T>::exchange(desired, (std::memory_order) memoryOrder);
123 }
124
125 T fetchAdd(T operand, MemoryOrder memoryOrder)
126 {
127 return std::atomic<T>::fetch_add(operand, (std::memory_order) memoryOrder);
128 }
129
130 T fetchSub(T operand, MemoryOrder memoryOrder)
131 {
132 return std::atomic<T>::fetch_sub(operand, (std::memory_order) memoryOrder);
133 }
134
135 T fetchAnd(T operand, MemoryOrder memoryOrder)
136 {
137 return std::atomic<T>::fetch_and(operand, (std::memory_order) memoryOrder);
138 }
139
140 T fetchOr(T operand, MemoryOrder memoryOrder)
141 {
142 return std::atomic<T>::fetch_or(operand, (std::memory_order) memoryOrder);
143 }
144};
145
146#endif // ATOMIC_H
float value(const T *src, size_t ch)
MemoryOrder
Definition atomic.h:56
@ Release
Definition atomic.h:60
@ Acquire
Definition atomic.h:59
@ ConsumeRelease
Definition atomic.h:61
@ AcquireRelease
Definition atomic.h:62
@ Relaxed
Definition atomic.h:57
@ Consume
Definition atomic.h:58
void signalFenceSeqCst()
Definition atomic.h:31
void threadFenceAcquire()
Definition atomic.h:41
void threadFenceConsume()
Definition atomic.h:36
void signalFenceAcquire()
Definition atomic.h:21
void signalFenceRelease()
Definition atomic.h:26
void threadFenceSeqCst()
Definition atomic.h:51
void threadFenceRelease()
Definition atomic.h:46
void signalFenceConsume()
Definition atomic.h:16
bool compareExchangeStrong(T &expected, T desired, MemoryOrder memoryOrder)
Definition atomic.h:110
Atomic(const Atomic &other)
Definition atomic.h:80
T exchange(T desired, MemoryOrder memoryOrder)
Definition atomic.h:120
void storeNonatomic(T value)
Definition atomic.h:94
bool compareExchangeWeak(T &expected, T desired, MemoryOrder success, MemoryOrder failure)
Definition atomic.h:115
Atomic(T value)
Definition atomic.h:76
T loadNonatomic() const
Definition atomic.h:84
T fetchAdd(T operand, MemoryOrder memoryOrder)
Definition atomic.h:125
T fetchSub(T operand, MemoryOrder memoryOrder)
Definition atomic.h:130
T fetchAnd(T operand, MemoryOrder memoryOrder)
Definition atomic.h:135
T operator=(T value)
T fetchOr(T operand, MemoryOrder memoryOrder)
Definition atomic.h:140
Atomic()
Definition atomic.h:72
T compareExchange(T expected, T desired, MemoryOrder memoryOrder)
Definition atomic.h:104
T load(MemoryOrder memoryOrder) const
Definition atomic.h:89
void store(T value, MemoryOrder memoryOrder)
Definition atomic.h:99