xref: /aosp_15_r20/external/libcxx/www/atomic_design_a.html (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2*58b9f456SAndroid Build Coastguard Worker          "http://www.w3.org/TR/html4/strict.dtd">
3*58b9f456SAndroid Build Coastguard Worker<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
4*58b9f456SAndroid Build Coastguard Worker<html>
5*58b9f456SAndroid Build Coastguard Worker<head>
6*58b9f456SAndroid Build Coastguard Worker  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
7*58b9f456SAndroid Build Coastguard Worker  <title>&lt;atomic&gt; design</title>
8*58b9f456SAndroid Build Coastguard Worker  <link type="text/css" rel="stylesheet" href="menu.css">
9*58b9f456SAndroid Build Coastguard Worker  <link type="text/css" rel="stylesheet" href="content.css">
10*58b9f456SAndroid Build Coastguard Worker</head>
11*58b9f456SAndroid Build Coastguard Worker
12*58b9f456SAndroid Build Coastguard Worker<body>
13*58b9f456SAndroid Build Coastguard Worker<div id="menu">
14*58b9f456SAndroid Build Coastguard Worker  <div>
15*58b9f456SAndroid Build Coastguard Worker    <a href="https://llvm.org/">LLVM Home</a>
16*58b9f456SAndroid Build Coastguard Worker  </div>
17*58b9f456SAndroid Build Coastguard Worker
18*58b9f456SAndroid Build Coastguard Worker  <div class="submenu">
19*58b9f456SAndroid Build Coastguard Worker    <label>libc++ Info</label>
20*58b9f456SAndroid Build Coastguard Worker    <a href="/index.html">About</a>
21*58b9f456SAndroid Build Coastguard Worker  </div>
22*58b9f456SAndroid Build Coastguard Worker
23*58b9f456SAndroid Build Coastguard Worker  <div class="submenu">
24*58b9f456SAndroid Build Coastguard Worker    <label>Quick Links</label>
25*58b9f456SAndroid Build Coastguard Worker    <a href="https://lists.llvm.org/mailman/listinfo/cfe-dev">cfe-dev</a>
26*58b9f456SAndroid Build Coastguard Worker    <a href="https://lists.llvm.org/mailman/listinfo/cfe-commits">cfe-commits</a>
27*58b9f456SAndroid Build Coastguard Worker    <a href="https://bugs.llvm.org/">Bug Reports</a>
28*58b9f456SAndroid Build Coastguard Worker    <a href="https://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a>
29*58b9f456SAndroid Build Coastguard Worker    <a href="https://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a>
30*58b9f456SAndroid Build Coastguard Worker  </div>
31*58b9f456SAndroid Build Coastguard Worker</div>
32*58b9f456SAndroid Build Coastguard Worker
33*58b9f456SAndroid Build Coastguard Worker<div id="content">
34*58b9f456SAndroid Build Coastguard Worker  <!--*********************************************************************-->
35*58b9f456SAndroid Build Coastguard Worker  <h1>&lt;atomic&gt; design</h1>
36*58b9f456SAndroid Build Coastguard Worker  <!--*********************************************************************-->
37*58b9f456SAndroid Build Coastguard Worker
38*58b9f456SAndroid Build Coastguard Worker<p>
39*58b9f456SAndroid Build Coastguard WorkerThe compiler supplies all of the intrinsics as described below.  This list of
40*58b9f456SAndroid Build Coastguard Workerintrinsics roughly parallels the requirements of the C and C++ atomics
41*58b9f456SAndroid Build Coastguard Workerproposals.  The C and C++ library implementations simply drop through to these
42*58b9f456SAndroid Build Coastguard Workerintrinsics.  Anything the platform does not support in hardware, the compiler
43*58b9f456SAndroid Build Coastguard Workerarranges for a (compiler-rt) library call to be made which will do the job with
44*58b9f456SAndroid Build Coastguard Workera mutex, and in this case ignoring the memory ordering parameter (effectively
45*58b9f456SAndroid Build Coastguard Workerimplementing <tt>memory_order_seq_cst</tt>).
46*58b9f456SAndroid Build Coastguard Worker</p>
47*58b9f456SAndroid Build Coastguard Worker
48*58b9f456SAndroid Build Coastguard Worker<p>
49*58b9f456SAndroid Build Coastguard WorkerUltimate efficiency is preferred over run time error checking.  Undefined
50*58b9f456SAndroid Build Coastguard Workerbehavior is acceptable when the inputs do not conform as defined below.
51*58b9f456SAndroid Build Coastguard Worker</p>
52*58b9f456SAndroid Build Coastguard Worker
53*58b9f456SAndroid Build Coastguard Worker<blockquote><pre>
54*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// In every intrinsic signature below, type* atomic_obj may be a pointer to a</font>
55*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//    volatile-qualified type.</font>
56*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Memory ordering values map to the following meanings:</font>
57*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   memory_order_relaxed == 0</font>
58*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   memory_order_consume == 1</font>
59*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   memory_order_acquire == 2</font>
60*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   memory_order_release == 3</font>
61*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   memory_order_acq_rel == 4</font>
62*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   memory_order_seq_cst == 5</font>
63*58b9f456SAndroid Build Coastguard Worker
64*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type must be trivially copyable</font>
65*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type represents a "type argument"</font>
66*58b9f456SAndroid Build Coastguard Workerbool __atomic_is_lock_free(type);
67*58b9f456SAndroid Build Coastguard Worker
68*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type must be trivially copyable</font>
69*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = 0, 1, 2, 5</font>
70*58b9f456SAndroid Build Coastguard Workertype __atomic_load(const type* atomic_obj, int mem_ord);
71*58b9f456SAndroid Build Coastguard Worker
72*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type must be trivially copyable</font>
73*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = 0, 3, 5</font>
74*58b9f456SAndroid Build Coastguard Workervoid __atomic_store(type* atomic_obj, type desired, int mem_ord);
75*58b9f456SAndroid Build Coastguard Worker
76*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type must be trivially copyable</font>
77*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
78*58b9f456SAndroid Build Coastguard Workertype __atomic_exchange(type* atomic_obj, type desired, int mem_ord);
79*58b9f456SAndroid Build Coastguard Worker
80*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type must be trivially copyable</font>
81*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_success = [0 ... 5],</font>
82*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   mem_failure &lt;= mem_success</font>
83*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   mem_failure != 3</font>
84*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   mem_failure != 4</font>
85*58b9f456SAndroid Build Coastguard Workerbool __atomic_compare_exchange_strong(type* atomic_obj,
86*58b9f456SAndroid Build Coastguard Worker                                      type* expected, type desired,
87*58b9f456SAndroid Build Coastguard Worker                                      int mem_success, int mem_failure);
88*58b9f456SAndroid Build Coastguard Worker
89*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type must be trivially copyable</font>
90*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_success = [0 ... 5],</font>
91*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   mem_failure &lt;= mem_success</font>
92*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   mem_failure != 3</font>
93*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//   mem_failure != 4</font>
94*58b9f456SAndroid Build Coastguard Workerbool __atomic_compare_exchange_weak(type* atomic_obj,
95*58b9f456SAndroid Build Coastguard Worker                                    type* expected, type desired,
96*58b9f456SAndroid Build Coastguard Worker                                    int mem_success, int mem_failure);
97*58b9f456SAndroid Build Coastguard Worker
98*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type is one of: char, signed char, unsigned char, short, unsigned short, int,</font>
99*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      unsigned int, long, unsigned long, long long, unsigned long long,</font>
100*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      char16_t, char32_t, wchar_t</font>
101*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
102*58b9f456SAndroid Build Coastguard Workertype __atomic_fetch_add(type* atomic_obj, type operand, int mem_ord);
103*58b9f456SAndroid Build Coastguard Worker
104*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type is one of: char, signed char, unsigned char, short, unsigned short, int,</font>
105*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      unsigned int, long, unsigned long, long long, unsigned long long,</font>
106*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      char16_t, char32_t, wchar_t</font>
107*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
108*58b9f456SAndroid Build Coastguard Workertype __atomic_fetch_sub(type* atomic_obj, type operand, int mem_ord);
109*58b9f456SAndroid Build Coastguard Worker
110*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type is one of: char, signed char, unsigned char, short, unsigned short, int,</font>
111*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      unsigned int, long, unsigned long, long long, unsigned long long,</font>
112*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      char16_t, char32_t, wchar_t</font>
113*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
114*58b9f456SAndroid Build Coastguard Workertype __atomic_fetch_and(type* atomic_obj, type operand, int mem_ord);
115*58b9f456SAndroid Build Coastguard Worker
116*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type is one of: char, signed char, unsigned char, short, unsigned short, int,</font>
117*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      unsigned int, long, unsigned long, long long, unsigned long long,</font>
118*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      char16_t, char32_t, wchar_t</font>
119*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
120*58b9f456SAndroid Build Coastguard Workertype __atomic_fetch_or(type* atomic_obj, type operand, int mem_ord);
121*58b9f456SAndroid Build Coastguard Worker
122*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// type is one of: char, signed char, unsigned char, short, unsigned short, int,</font>
123*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      unsigned int, long, unsigned long, long long, unsigned long long,</font>
124*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">//      char16_t, char32_t, wchar_t</font>
125*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
126*58b9f456SAndroid Build Coastguard Workertype __atomic_fetch_xor(type* atomic_obj, type operand, int mem_ord);
127*58b9f456SAndroid Build Coastguard Worker
128*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
129*58b9f456SAndroid Build Coastguard Workervoid* __atomic_fetch_add(void** atomic_obj, ptrdiff_t operand, int mem_ord);
130*58b9f456SAndroid Build Coastguard Workervoid* __atomic_fetch_sub(void** atomic_obj, ptrdiff_t operand, int mem_ord);
131*58b9f456SAndroid Build Coastguard Worker
132*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// Behavior is defined for mem_ord = [0 ... 5]</font>
133*58b9f456SAndroid Build Coastguard Workervoid __atomic_thread_fence(int mem_ord);
134*58b9f456SAndroid Build Coastguard Workervoid __atomic_signal_fence(int mem_ord);
135*58b9f456SAndroid Build Coastguard Worker</pre></blockquote>
136*58b9f456SAndroid Build Coastguard Worker
137*58b9f456SAndroid Build Coastguard Worker<p>
138*58b9f456SAndroid Build Coastguard WorkerIf desired the intrinsics taking a single <tt>mem_ord</tt> parameter can default
139*58b9f456SAndroid Build Coastguard Workerthis argument to 5.
140*58b9f456SAndroid Build Coastguard Worker</p>
141*58b9f456SAndroid Build Coastguard Worker
142*58b9f456SAndroid Build Coastguard Worker<p>
143*58b9f456SAndroid Build Coastguard WorkerIf desired the intrinsics taking two ordering parameters can default
144*58b9f456SAndroid Build Coastguard Worker<tt>mem_success</tt> to 5, and <tt>mem_failure</tt> to
145*58b9f456SAndroid Build Coastguard Worker<tt>translate_memory_order(mem_success)</tt> where
146*58b9f456SAndroid Build Coastguard Worker<tt>translate_memory_order(mem_success)</tt> is defined as:
147*58b9f456SAndroid Build Coastguard Worker</p>
148*58b9f456SAndroid Build Coastguard Worker
149*58b9f456SAndroid Build Coastguard Worker<blockquote><pre>
150*58b9f456SAndroid Build Coastguard Workerint
151*58b9f456SAndroid Build Coastguard Workertranslate_memory_order(int o)
152*58b9f456SAndroid Build Coastguard Worker{
153*58b9f456SAndroid Build Coastguard Worker    switch (o)
154*58b9f456SAndroid Build Coastguard Worker    {
155*58b9f456SAndroid Build Coastguard Worker    case 4:
156*58b9f456SAndroid Build Coastguard Worker        return 2;
157*58b9f456SAndroid Build Coastguard Worker    case 3:
158*58b9f456SAndroid Build Coastguard Worker        return 0;
159*58b9f456SAndroid Build Coastguard Worker    }
160*58b9f456SAndroid Build Coastguard Worker    return o;
161*58b9f456SAndroid Build Coastguard Worker}
162*58b9f456SAndroid Build Coastguard Worker</pre></blockquote>
163*58b9f456SAndroid Build Coastguard Worker
164*58b9f456SAndroid Build Coastguard Worker<p>
165*58b9f456SAndroid Build Coastguard WorkerBelow are representative C++ implementations of all of the operations.  Their
166*58b9f456SAndroid Build Coastguard Workerpurpose is to document the desired semantics of each operation, assuming
167*58b9f456SAndroid Build Coastguard Worker<tt>memory_order_seq_cst</tt>.  This is essentially the code that will be called
168*58b9f456SAndroid Build Coastguard Workerif the front end calls out to compiler-rt.
169*58b9f456SAndroid Build Coastguard Worker</p>
170*58b9f456SAndroid Build Coastguard Worker
171*58b9f456SAndroid Build Coastguard Worker<blockquote><pre>
172*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
173*58b9f456SAndroid Build Coastguard WorkerT
174*58b9f456SAndroid Build Coastguard Worker__atomic_load(T const volatile* obj)
175*58b9f456SAndroid Build Coastguard Worker{
176*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
177*58b9f456SAndroid Build Coastguard Worker    return *obj;
178*58b9f456SAndroid Build Coastguard Worker}
179*58b9f456SAndroid Build Coastguard Worker
180*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
181*58b9f456SAndroid Build Coastguard Workervoid
182*58b9f456SAndroid Build Coastguard Worker__atomic_store(T volatile* obj, T desr)
183*58b9f456SAndroid Build Coastguard Worker{
184*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
185*58b9f456SAndroid Build Coastguard Worker    *obj = desr;
186*58b9f456SAndroid Build Coastguard Worker}
187*58b9f456SAndroid Build Coastguard Worker
188*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
189*58b9f456SAndroid Build Coastguard WorkerT
190*58b9f456SAndroid Build Coastguard Worker__atomic_exchange(T volatile* obj, T desr)
191*58b9f456SAndroid Build Coastguard Worker{
192*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
193*58b9f456SAndroid Build Coastguard Worker    T r = *obj;
194*58b9f456SAndroid Build Coastguard Worker    *obj = desr;
195*58b9f456SAndroid Build Coastguard Worker    return r;
196*58b9f456SAndroid Build Coastguard Worker}
197*58b9f456SAndroid Build Coastguard Worker
198*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
199*58b9f456SAndroid Build Coastguard Workerbool
200*58b9f456SAndroid Build Coastguard Worker__atomic_compare_exchange_strong(T volatile* obj, T* exp, T desr)
201*58b9f456SAndroid Build Coastguard Worker{
202*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
203*58b9f456SAndroid Build Coastguard Worker    if (std::memcmp(const_cast&lt;T*&gt;(obj), exp, sizeof(T)) == 0) <font color="#C80000">// if (*obj == *exp)</font>
204*58b9f456SAndroid Build Coastguard Worker    {
205*58b9f456SAndroid Build Coastguard Worker        std::memcpy(const_cast&lt;T*&gt;(obj), &amp;desr, sizeof(T)); <font color="#C80000">// *obj = desr;</font>
206*58b9f456SAndroid Build Coastguard Worker        return true;
207*58b9f456SAndroid Build Coastguard Worker    }
208*58b9f456SAndroid Build Coastguard Worker    std::memcpy(exp, const_cast&lt;T*&gt;(obj), sizeof(T)); <font color="#C80000">// *exp = *obj;</font>
209*58b9f456SAndroid Build Coastguard Worker    return false;
210*58b9f456SAndroid Build Coastguard Worker}
211*58b9f456SAndroid Build Coastguard Worker
212*58b9f456SAndroid Build Coastguard Worker<font color="#C80000">// May spuriously return false (even if *obj == *exp)</font>
213*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
214*58b9f456SAndroid Build Coastguard Workerbool
215*58b9f456SAndroid Build Coastguard Worker__atomic_compare_exchange_weak(T volatile* obj, T* exp, T desr)
216*58b9f456SAndroid Build Coastguard Worker{
217*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
218*58b9f456SAndroid Build Coastguard Worker    if (std::memcmp(const_cast&lt;T*&gt;(obj), exp, sizeof(T)) == 0) <font color="#C80000">// if (*obj == *exp)</font>
219*58b9f456SAndroid Build Coastguard Worker    {
220*58b9f456SAndroid Build Coastguard Worker        std::memcpy(const_cast&lt;T*&gt;(obj), &amp;desr, sizeof(T)); <font color="#C80000">// *obj = desr;</font>
221*58b9f456SAndroid Build Coastguard Worker        return true;
222*58b9f456SAndroid Build Coastguard Worker    }
223*58b9f456SAndroid Build Coastguard Worker    std::memcpy(exp, const_cast&lt;T*&gt;(obj), sizeof(T)); <font color="#C80000">// *exp = *obj;</font>
224*58b9f456SAndroid Build Coastguard Worker    return false;
225*58b9f456SAndroid Build Coastguard Worker}
226*58b9f456SAndroid Build Coastguard Worker
227*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
228*58b9f456SAndroid Build Coastguard WorkerT
229*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_add(T volatile* obj, T operand)
230*58b9f456SAndroid Build Coastguard Worker{
231*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
232*58b9f456SAndroid Build Coastguard Worker    T r = *obj;
233*58b9f456SAndroid Build Coastguard Worker    *obj += operand;
234*58b9f456SAndroid Build Coastguard Worker    return r;
235*58b9f456SAndroid Build Coastguard Worker}
236*58b9f456SAndroid Build Coastguard Worker
237*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
238*58b9f456SAndroid Build Coastguard WorkerT
239*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_sub(T volatile* obj, T operand)
240*58b9f456SAndroid Build Coastguard Worker{
241*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
242*58b9f456SAndroid Build Coastguard Worker    T r = *obj;
243*58b9f456SAndroid Build Coastguard Worker    *obj -= operand;
244*58b9f456SAndroid Build Coastguard Worker    return r;
245*58b9f456SAndroid Build Coastguard Worker}
246*58b9f456SAndroid Build Coastguard Worker
247*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
248*58b9f456SAndroid Build Coastguard WorkerT
249*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_and(T volatile* obj, T operand)
250*58b9f456SAndroid Build Coastguard Worker{
251*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
252*58b9f456SAndroid Build Coastguard Worker    T r = *obj;
253*58b9f456SAndroid Build Coastguard Worker    *obj &amp;= operand;
254*58b9f456SAndroid Build Coastguard Worker    return r;
255*58b9f456SAndroid Build Coastguard Worker}
256*58b9f456SAndroid Build Coastguard Worker
257*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
258*58b9f456SAndroid Build Coastguard WorkerT
259*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_or(T volatile* obj, T operand)
260*58b9f456SAndroid Build Coastguard Worker{
261*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
262*58b9f456SAndroid Build Coastguard Worker    T r = *obj;
263*58b9f456SAndroid Build Coastguard Worker    *obj |= operand;
264*58b9f456SAndroid Build Coastguard Worker    return r;
265*58b9f456SAndroid Build Coastguard Worker}
266*58b9f456SAndroid Build Coastguard Worker
267*58b9f456SAndroid Build Coastguard Workertemplate &lt;class T&gt;
268*58b9f456SAndroid Build Coastguard WorkerT
269*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_xor(T volatile* obj, T operand)
270*58b9f456SAndroid Build Coastguard Worker{
271*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
272*58b9f456SAndroid Build Coastguard Worker    T r = *obj;
273*58b9f456SAndroid Build Coastguard Worker    *obj ^= operand;
274*58b9f456SAndroid Build Coastguard Worker    return r;
275*58b9f456SAndroid Build Coastguard Worker}
276*58b9f456SAndroid Build Coastguard Worker
277*58b9f456SAndroid Build Coastguard Workervoid*
278*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_add(void* volatile* obj, ptrdiff_t operand)
279*58b9f456SAndroid Build Coastguard Worker{
280*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
281*58b9f456SAndroid Build Coastguard Worker    void* r = *obj;
282*58b9f456SAndroid Build Coastguard Worker    (char*&amp;)(*obj) += operand;
283*58b9f456SAndroid Build Coastguard Worker    return r;
284*58b9f456SAndroid Build Coastguard Worker}
285*58b9f456SAndroid Build Coastguard Worker
286*58b9f456SAndroid Build Coastguard Workervoid*
287*58b9f456SAndroid Build Coastguard Worker__atomic_fetch_sub(void* volatile* obj, ptrdiff_t operand)
288*58b9f456SAndroid Build Coastguard Worker{
289*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
290*58b9f456SAndroid Build Coastguard Worker    void* r = *obj;
291*58b9f456SAndroid Build Coastguard Worker    (char*&amp;)(*obj) -= operand;
292*58b9f456SAndroid Build Coastguard Worker    return r;
293*58b9f456SAndroid Build Coastguard Worker}
294*58b9f456SAndroid Build Coastguard Worker
295*58b9f456SAndroid Build Coastguard Workervoid __atomic_thread_fence()
296*58b9f456SAndroid Build Coastguard Worker{
297*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
298*58b9f456SAndroid Build Coastguard Worker}
299*58b9f456SAndroid Build Coastguard Worker
300*58b9f456SAndroid Build Coastguard Workervoid __atomic_signal_fence()
301*58b9f456SAndroid Build Coastguard Worker{
302*58b9f456SAndroid Build Coastguard Worker    unique_lock&lt;mutex&gt; _(some_mutex);
303*58b9f456SAndroid Build Coastguard Worker}
304*58b9f456SAndroid Build Coastguard Worker</pre></blockquote>
305*58b9f456SAndroid Build Coastguard Worker
306*58b9f456SAndroid Build Coastguard Worker
307*58b9f456SAndroid Build Coastguard Worker</div>
308*58b9f456SAndroid Build Coastguard Worker</body>
309*58b9f456SAndroid Build Coastguard Worker</html>
310