1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
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
17// Don't edit this file!  It is auto-generated by frameworks/rs/api/generate.sh.
18
19/*
20 * rs_atomic.rsh: Atomic Update Functions
21 *
22 * 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 done in the right order.
25 *
26 * These functions are slower than their non-atomic equivalents, 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.
34 */
35
36#ifndef RENDERSCRIPT_RS_ATOMIC_RSH
37#define RENDERSCRIPT_RS_ATOMIC_RSH
38
39/*
40 * rsAtomicAdd: Thread-safe addition
41 *
42 * Atomicly adds a value to the value at addr, i.e. *addr += value.
43 *
44 * Parameters:
45 *   addr: Address of the value to modify.
46 *   value: Amount to add.
47 *
48 * Returns: Value of *addr prior to the operation.
49 */
50#if (defined(RS_VERSION) && (RS_VERSION >= 14))
51extern int32_t __attribute__((overloadable))
52    rsAtomicAdd(volatile int32_t* addr, int32_t value);
53#endif
54
55#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:
67 *   addr: Address of the value to modify.
68 *   value: Value to and with.
69 *
70 * Returns: Value of *addr prior to the operation.
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:
92 *   addr: Address of the value to compare and replace if the test passes.
93 *   compareValue: Value to test *addr against.
94 *   newValue: Value to write if the test passes.
95 *
96 * Returns: Value of *addr prior to the operation.
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.  This is equivalent to rsAtomicSub(addr, 1).
112 *
113 * Parameters:
114 *   addr: Address of the value to decrement.
115 *
116 * Returns: Value of *addr prior to the operation.
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.  This is equivalent to rsAtomicAdd(addr, 1).
132 *
133 * Parameters:
134 *   addr: Address of the value to increment.
135 *
136 * Returns: Value of *addr prior to the operation.
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:
155 *   addr: Address of the value to modify.
156 *   value: Comparison value.
157 *
158 * Returns: Value of *addr prior to the operation.
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:
177 *   addr: Address of the value to modify.
178 *   value: Comparison value.
179 *
180 * Returns: Value of *addr prior to the operation.
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:
199 *   addr: Address of the value to modify.
200 *   value: Value to or with.
201 *
202 * Returns: Value of *addr prior to the operation.
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:
220 *   addr: Address of the value to modify.
221 *   value: Amount to subtract.
222 *
223 * Returns: Value of *addr prior to the operation.
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:
242 *   addr: Address of the value to modify.
243 *   value: Value to xor with.
244 *
245 * Returns: Value of *addr prior to the operation.
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
258