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