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