xref: /aosp_15_r20/prebuilts/sdk/renderscript/include/rs_atomic.rsh (revision 344a7f5ef16c479e7a7f54ee6567a9d112f9e72b)
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