1*344a7f5eSAndroid Build Coastguard Worker/* 2*344a7f5eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*344a7f5eSAndroid Build Coastguard Worker * 4*344a7f5eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*344a7f5eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*344a7f5eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*344a7f5eSAndroid Build Coastguard Worker * 8*344a7f5eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*344a7f5eSAndroid Build Coastguard Worker * 10*344a7f5eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*344a7f5eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*344a7f5eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*344a7f5eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*344a7f5eSAndroid Build Coastguard Worker * limitations under the License. 15*344a7f5eSAndroid Build Coastguard Worker */ 16*344a7f5eSAndroid Build Coastguard Worker 17*344a7f5eSAndroid Build Coastguard Worker// Don't edit this file! It is auto-generated by frameworks/rs/api/generate.sh. 18*344a7f5eSAndroid Build Coastguard Worker 19*344a7f5eSAndroid Build Coastguard Worker/* 20*344a7f5eSAndroid Build Coastguard Worker * rs_atomic.rsh: Atomic Update Functions 21*344a7f5eSAndroid Build Coastguard Worker * 22*344a7f5eSAndroid Build Coastguard Worker * To update values shared between multiple threads, use the functions below. 23*344a7f5eSAndroid Build Coastguard Worker * They ensure that the values are atomically updated, i.e. that the memory 24*344a7f5eSAndroid Build Coastguard Worker * reads, the updates, and the memory writes are done in the right order. 25*344a7f5eSAndroid Build Coastguard Worker * 26*344a7f5eSAndroid Build Coastguard Worker * These functions are slower than their non-atomic equivalents, so use 27*344a7f5eSAndroid Build Coastguard Worker * them only when synchronization is needed. 28*344a7f5eSAndroid Build Coastguard Worker * 29*344a7f5eSAndroid Build Coastguard Worker * Note that in RenderScript, your code is likely to be running in separate 30*344a7f5eSAndroid Build Coastguard Worker * threads even though you did not explicitely create them. The RenderScript 31*344a7f5eSAndroid Build Coastguard Worker * runtime will very often split the execution of one kernel across multiple 32*344a7f5eSAndroid Build Coastguard Worker * threads. Updating globals should be done with atomic functions. If possible, 33*344a7f5eSAndroid Build Coastguard Worker * modify your algorithm to avoid them altogether. 34*344a7f5eSAndroid Build Coastguard Worker */ 35*344a7f5eSAndroid Build Coastguard Worker 36*344a7f5eSAndroid Build Coastguard Worker#ifndef RENDERSCRIPT_RS_ATOMIC_RSH 37*344a7f5eSAndroid Build Coastguard Worker#define RENDERSCRIPT_RS_ATOMIC_RSH 38*344a7f5eSAndroid Build Coastguard Worker 39*344a7f5eSAndroid Build Coastguard Worker/* 40*344a7f5eSAndroid Build Coastguard Worker * rsAtomicAdd: Thread-safe addition 41*344a7f5eSAndroid Build Coastguard Worker * 42*344a7f5eSAndroid Build Coastguard Worker * Atomicly adds a value to the value at addr, i.e. *addr += value. 43*344a7f5eSAndroid Build Coastguard Worker * 44*344a7f5eSAndroid Build Coastguard Worker * Parameters: 45*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 46*344a7f5eSAndroid Build Coastguard Worker * value: Amount to add. 47*344a7f5eSAndroid Build Coastguard Worker * 48*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 49*344a7f5eSAndroid Build Coastguard Worker */ 50*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 51*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 52*344a7f5eSAndroid Build Coastguard Worker rsAtomicAdd(volatile int32_t* addr, int32_t value); 53*344a7f5eSAndroid Build Coastguard Worker#endif 54*344a7f5eSAndroid Build Coastguard Worker 55*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 56*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 57*344a7f5eSAndroid Build Coastguard Worker rsAtomicAdd(volatile uint32_t* addr, uint32_t value); 58*344a7f5eSAndroid Build Coastguard Worker#endif 59*344a7f5eSAndroid Build Coastguard Worker 60*344a7f5eSAndroid Build Coastguard Worker/* 61*344a7f5eSAndroid Build Coastguard Worker * rsAtomicAnd: Thread-safe bitwise and 62*344a7f5eSAndroid Build Coastguard Worker * 63*344a7f5eSAndroid Build Coastguard Worker * Atomicly performs a bitwise and of two values, storing the result back at addr, 64*344a7f5eSAndroid Build Coastguard Worker * i.e. *addr &= value. 65*344a7f5eSAndroid Build Coastguard Worker * 66*344a7f5eSAndroid Build Coastguard Worker * Parameters: 67*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 68*344a7f5eSAndroid Build Coastguard Worker * value: Value to and with. 69*344a7f5eSAndroid Build Coastguard Worker * 70*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 71*344a7f5eSAndroid Build Coastguard Worker */ 72*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 73*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 74*344a7f5eSAndroid Build Coastguard Worker rsAtomicAnd(volatile int32_t* addr, int32_t value); 75*344a7f5eSAndroid Build Coastguard Worker#endif 76*344a7f5eSAndroid Build Coastguard Worker 77*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 78*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 79*344a7f5eSAndroid Build Coastguard Worker rsAtomicAnd(volatile uint32_t* addr, uint32_t value); 80*344a7f5eSAndroid Build Coastguard Worker#endif 81*344a7f5eSAndroid Build Coastguard Worker 82*344a7f5eSAndroid Build Coastguard Worker/* 83*344a7f5eSAndroid Build Coastguard Worker * rsAtomicCas: Thread-safe compare and set 84*344a7f5eSAndroid Build Coastguard Worker * 85*344a7f5eSAndroid Build Coastguard Worker * If the value at addr matches compareValue then the newValue is written at addr, 86*344a7f5eSAndroid Build Coastguard Worker * i.e. if (*addr == compareValue) { *addr = newValue; }. 87*344a7f5eSAndroid Build Coastguard Worker * 88*344a7f5eSAndroid Build Coastguard Worker * You can check that the value was written by checking that the value returned 89*344a7f5eSAndroid Build Coastguard Worker * by rsAtomicCas() is compareValue. 90*344a7f5eSAndroid Build Coastguard Worker * 91*344a7f5eSAndroid Build Coastguard Worker * Parameters: 92*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to compare and replace if the test passes. 93*344a7f5eSAndroid Build Coastguard Worker * compareValue: Value to test *addr against. 94*344a7f5eSAndroid Build Coastguard Worker * newValue: Value to write if the test passes. 95*344a7f5eSAndroid Build Coastguard Worker * 96*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 97*344a7f5eSAndroid Build Coastguard Worker */ 98*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 99*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 100*344a7f5eSAndroid Build Coastguard Worker rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); 101*344a7f5eSAndroid Build Coastguard Worker#endif 102*344a7f5eSAndroid Build Coastguard Worker 103*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 104*344a7f5eSAndroid Build Coastguard Workerextern uint32_t __attribute__((overloadable)) 105*344a7f5eSAndroid Build Coastguard Worker rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); 106*344a7f5eSAndroid Build Coastguard Worker#endif 107*344a7f5eSAndroid Build Coastguard Worker 108*344a7f5eSAndroid Build Coastguard Worker/* 109*344a7f5eSAndroid Build Coastguard Worker * rsAtomicDec: Thread-safe decrement 110*344a7f5eSAndroid Build Coastguard Worker * 111*344a7f5eSAndroid Build Coastguard Worker * Atomicly subtracts one from the value at addr. This is equivalent to rsAtomicSub(addr, 1). 112*344a7f5eSAndroid Build Coastguard Worker * 113*344a7f5eSAndroid Build Coastguard Worker * Parameters: 114*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to decrement. 115*344a7f5eSAndroid Build Coastguard Worker * 116*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 117*344a7f5eSAndroid Build Coastguard Worker */ 118*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 119*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 120*344a7f5eSAndroid Build Coastguard Worker rsAtomicDec(volatile int32_t* addr); 121*344a7f5eSAndroid Build Coastguard Worker#endif 122*344a7f5eSAndroid Build Coastguard Worker 123*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 124*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 125*344a7f5eSAndroid Build Coastguard Worker rsAtomicDec(volatile uint32_t* addr); 126*344a7f5eSAndroid Build Coastguard Worker#endif 127*344a7f5eSAndroid Build Coastguard Worker 128*344a7f5eSAndroid Build Coastguard Worker/* 129*344a7f5eSAndroid Build Coastguard Worker * rsAtomicInc: Thread-safe increment 130*344a7f5eSAndroid Build Coastguard Worker * 131*344a7f5eSAndroid Build Coastguard Worker * Atomicly adds one to the value at addr. This is equivalent to rsAtomicAdd(addr, 1). 132*344a7f5eSAndroid Build Coastguard Worker * 133*344a7f5eSAndroid Build Coastguard Worker * Parameters: 134*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to increment. 135*344a7f5eSAndroid Build Coastguard Worker * 136*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 137*344a7f5eSAndroid Build Coastguard Worker */ 138*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 139*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 140*344a7f5eSAndroid Build Coastguard Worker rsAtomicInc(volatile int32_t* addr); 141*344a7f5eSAndroid Build Coastguard Worker#endif 142*344a7f5eSAndroid Build Coastguard Worker 143*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 144*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 145*344a7f5eSAndroid Build Coastguard Worker rsAtomicInc(volatile uint32_t* addr); 146*344a7f5eSAndroid Build Coastguard Worker#endif 147*344a7f5eSAndroid Build Coastguard Worker 148*344a7f5eSAndroid Build Coastguard Worker/* 149*344a7f5eSAndroid Build Coastguard Worker * rsAtomicMax: Thread-safe maximum 150*344a7f5eSAndroid Build Coastguard Worker * 151*344a7f5eSAndroid Build Coastguard Worker * Atomicly sets the value at addr to the maximum of *addr and value, i.e. 152*344a7f5eSAndroid Build Coastguard Worker * *addr = max(*addr, value). 153*344a7f5eSAndroid Build Coastguard Worker * 154*344a7f5eSAndroid Build Coastguard Worker * Parameters: 155*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 156*344a7f5eSAndroid Build Coastguard Worker * value: Comparison value. 157*344a7f5eSAndroid Build Coastguard Worker * 158*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 159*344a7f5eSAndroid Build Coastguard Worker */ 160*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 161*344a7f5eSAndroid Build Coastguard Workerextern uint32_t __attribute__((overloadable)) 162*344a7f5eSAndroid Build Coastguard Worker rsAtomicMax(volatile uint32_t* addr, uint32_t value); 163*344a7f5eSAndroid Build Coastguard Worker#endif 164*344a7f5eSAndroid Build Coastguard Worker 165*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 166*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 167*344a7f5eSAndroid Build Coastguard Worker rsAtomicMax(volatile int32_t* addr, int32_t value); 168*344a7f5eSAndroid Build Coastguard Worker#endif 169*344a7f5eSAndroid Build Coastguard Worker 170*344a7f5eSAndroid Build Coastguard Worker/* 171*344a7f5eSAndroid Build Coastguard Worker * rsAtomicMin: Thread-safe minimum 172*344a7f5eSAndroid Build Coastguard Worker * 173*344a7f5eSAndroid Build Coastguard Worker * Atomicly sets the value at addr to the minimum of *addr and value, i.e. 174*344a7f5eSAndroid Build Coastguard Worker * *addr = min(*addr, value). 175*344a7f5eSAndroid Build Coastguard Worker * 176*344a7f5eSAndroid Build Coastguard Worker * Parameters: 177*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 178*344a7f5eSAndroid Build Coastguard Worker * value: Comparison value. 179*344a7f5eSAndroid Build Coastguard Worker * 180*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 181*344a7f5eSAndroid Build Coastguard Worker */ 182*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 183*344a7f5eSAndroid Build Coastguard Workerextern uint32_t __attribute__((overloadable)) 184*344a7f5eSAndroid Build Coastguard Worker rsAtomicMin(volatile uint32_t* addr, uint32_t value); 185*344a7f5eSAndroid Build Coastguard Worker#endif 186*344a7f5eSAndroid Build Coastguard Worker 187*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 188*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 189*344a7f5eSAndroid Build Coastguard Worker rsAtomicMin(volatile int32_t* addr, int32_t value); 190*344a7f5eSAndroid Build Coastguard Worker#endif 191*344a7f5eSAndroid Build Coastguard Worker 192*344a7f5eSAndroid Build Coastguard Worker/* 193*344a7f5eSAndroid Build Coastguard Worker * rsAtomicOr: Thread-safe bitwise or 194*344a7f5eSAndroid Build Coastguard Worker * 195*344a7f5eSAndroid Build Coastguard Worker * Atomicly perform a bitwise or two values, storing the result at addr, 196*344a7f5eSAndroid Build Coastguard Worker * i.e. *addr |= value. 197*344a7f5eSAndroid Build Coastguard Worker * 198*344a7f5eSAndroid Build Coastguard Worker * Parameters: 199*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 200*344a7f5eSAndroid Build Coastguard Worker * value: Value to or with. 201*344a7f5eSAndroid Build Coastguard Worker * 202*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 203*344a7f5eSAndroid Build Coastguard Worker */ 204*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 205*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 206*344a7f5eSAndroid Build Coastguard Worker rsAtomicOr(volatile int32_t* addr, int32_t value); 207*344a7f5eSAndroid Build Coastguard Worker#endif 208*344a7f5eSAndroid Build Coastguard Worker 209*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 210*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 211*344a7f5eSAndroid Build Coastguard Worker rsAtomicOr(volatile uint32_t* addr, uint32_t value); 212*344a7f5eSAndroid Build Coastguard Worker#endif 213*344a7f5eSAndroid Build Coastguard Worker 214*344a7f5eSAndroid Build Coastguard Worker/* 215*344a7f5eSAndroid Build Coastguard Worker * rsAtomicSub: Thread-safe subtraction 216*344a7f5eSAndroid Build Coastguard Worker * 217*344a7f5eSAndroid Build Coastguard Worker * Atomicly subtracts a value from the value at addr, i.e. *addr -= value. 218*344a7f5eSAndroid Build Coastguard Worker * 219*344a7f5eSAndroid Build Coastguard Worker * Parameters: 220*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 221*344a7f5eSAndroid Build Coastguard Worker * value: Amount to subtract. 222*344a7f5eSAndroid Build Coastguard Worker * 223*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 224*344a7f5eSAndroid Build Coastguard Worker */ 225*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 226*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 227*344a7f5eSAndroid Build Coastguard Worker rsAtomicSub(volatile int32_t* addr, int32_t value); 228*344a7f5eSAndroid Build Coastguard Worker#endif 229*344a7f5eSAndroid Build Coastguard Worker 230*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 231*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 232*344a7f5eSAndroid Build Coastguard Worker rsAtomicSub(volatile uint32_t* addr, uint32_t value); 233*344a7f5eSAndroid Build Coastguard Worker#endif 234*344a7f5eSAndroid Build Coastguard Worker 235*344a7f5eSAndroid Build Coastguard Worker/* 236*344a7f5eSAndroid Build Coastguard Worker * rsAtomicXor: Thread-safe bitwise exclusive or 237*344a7f5eSAndroid Build Coastguard Worker * 238*344a7f5eSAndroid Build Coastguard Worker * Atomicly performs a bitwise xor of two values, storing the result at addr, 239*344a7f5eSAndroid Build Coastguard Worker * i.e. *addr ^= value. 240*344a7f5eSAndroid Build Coastguard Worker * 241*344a7f5eSAndroid Build Coastguard Worker * Parameters: 242*344a7f5eSAndroid Build Coastguard Worker * addr: Address of the value to modify. 243*344a7f5eSAndroid Build Coastguard Worker * value: Value to xor with. 244*344a7f5eSAndroid Build Coastguard Worker * 245*344a7f5eSAndroid Build Coastguard Worker * Returns: Value of *addr prior to the operation. 246*344a7f5eSAndroid Build Coastguard Worker */ 247*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 14)) 248*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 249*344a7f5eSAndroid Build Coastguard Worker rsAtomicXor(volatile int32_t* addr, int32_t value); 250*344a7f5eSAndroid Build Coastguard Worker#endif 251*344a7f5eSAndroid Build Coastguard Worker 252*344a7f5eSAndroid Build Coastguard Worker#if (defined(RS_VERSION) && (RS_VERSION >= 20)) 253*344a7f5eSAndroid Build Coastguard Workerextern int32_t __attribute__((overloadable)) 254*344a7f5eSAndroid Build Coastguard Worker rsAtomicXor(volatile uint32_t* addr, uint32_t value); 255*344a7f5eSAndroid Build Coastguard Worker#endif 256*344a7f5eSAndroid Build Coastguard Worker 257*344a7f5eSAndroid Build Coastguard Worker#endif // RENDERSCRIPT_RS_ATOMIC_RSH 258