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><atomic> 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><atomic> 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 <= 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 <= 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 <class T> 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<mutex> _(some_mutex); 177*58b9f456SAndroid Build Coastguard Worker return *obj; 178*58b9f456SAndroid Build Coastguard Worker} 179*58b9f456SAndroid Build Coastguard Worker 180*58b9f456SAndroid Build Coastguard Workertemplate <class T> 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<mutex> _(some_mutex); 185*58b9f456SAndroid Build Coastguard Worker *obj = desr; 186*58b9f456SAndroid Build Coastguard Worker} 187*58b9f456SAndroid Build Coastguard Worker 188*58b9f456SAndroid Build Coastguard Workertemplate <class T> 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<mutex> _(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 <class T> 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<mutex> _(some_mutex); 203*58b9f456SAndroid Build Coastguard Worker if (std::memcmp(const_cast<T*>(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<T*>(obj), &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<T*>(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 <class T> 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<mutex> _(some_mutex); 218*58b9f456SAndroid Build Coastguard Worker if (std::memcmp(const_cast<T*>(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<T*>(obj), &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<T*>(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 <class T> 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<mutex> _(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 <class T> 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<mutex> _(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 <class T> 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<mutex> _(some_mutex); 252*58b9f456SAndroid Build Coastguard Worker T r = *obj; 253*58b9f456SAndroid Build Coastguard Worker *obj &= operand; 254*58b9f456SAndroid Build Coastguard Worker return r; 255*58b9f456SAndroid Build Coastguard Worker} 256*58b9f456SAndroid Build Coastguard Worker 257*58b9f456SAndroid Build Coastguard Workertemplate <class T> 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<mutex> _(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 <class T> 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<mutex> _(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<mutex> _(some_mutex); 281*58b9f456SAndroid Build Coastguard Worker void* r = *obj; 282*58b9f456SAndroid Build Coastguard Worker (char*&)(*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<mutex> _(some_mutex); 290*58b9f456SAndroid Build Coastguard Worker void* r = *obj; 291*58b9f456SAndroid Build Coastguard Worker (char*&)(*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<mutex> _(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<mutex> _(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