diff options
Diffstat (limited to 'renderscript/include/rs_atomic.rsh')
-rw-r--r-- | renderscript/include/rs_atomic.rsh | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/renderscript/include/rs_atomic.rsh b/renderscript/include/rs_atomic.rsh new file mode 100644 index 0000000..98a8784 --- /dev/null +++ b/renderscript/include/rs_atomic.rsh @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Don't edit this file! It is auto-generated by frameworks/rs/api/generate.sh. + +/* + * rs_atomic.rsh: Atomic Update Functions + * + * To update values shared between multiple threads, use the functions below. + * They ensure that the values are atomically updated, i.e. that the memory + * reads, the updates, and the memory writes are done in the right order. + * + * These functions are slower than their non-atomic equivalents, so use + * them only when synchronization is needed. + * + * Note that in RenderScript, your code is likely to be running in separate + * threads even though you did not explicitely create them. The RenderScript + * runtime will very often split the execution of one kernel across multiple + * threads. Updating globals should be done with atomic functions. If possible, + * modify your algorithm to avoid them altogether. + */ + +#ifndef RENDERSCRIPT_RS_ATOMIC_RSH +#define RENDERSCRIPT_RS_ATOMIC_RSH + +/* + * rsAtomicAdd: Thread-safe addition + * + * Atomicly adds a value to the value at addr, i.e. *addr += value. + * + * Parameters: + * addr: Address of the value to modify. + * value: Amount to add. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicAdd(volatile int32_t* addr, int32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicAdd(volatile uint32_t* addr, uint32_t value); +#endif + +/* + * rsAtomicAnd: Thread-safe bitwise and + * + * Atomicly performs a bitwise and of two values, storing the result back at addr, + * i.e. *addr &= value. + * + * Parameters: + * addr: Address of the value to modify. + * value: Value to and with. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicAnd(volatile int32_t* addr, int32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicAnd(volatile uint32_t* addr, uint32_t value); +#endif + +/* + * rsAtomicCas: Thread-safe compare and set + * + * If the value at addr matches compareValue then the newValue is written at addr, + * i.e. if (*addr == compareValue) { *addr = newValue; }. + * + * You can check that the value was written by checking that the value returned + * by rsAtomicCas() is compareValue. + * + * Parameters: + * addr: Address of the value to compare and replace if the test passes. + * compareValue: Value to test *addr against. + * newValue: Value to write if the test passes. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern uint32_t __attribute__((overloadable)) + rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); +#endif + +/* + * rsAtomicDec: Thread-safe decrement + * + * Atomicly subtracts one from the value at addr. This is equivalent to rsAtomicSub(addr, 1). + * + * Parameters: + * addr: Address of the value to decrement. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicDec(volatile int32_t* addr); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicDec(volatile uint32_t* addr); +#endif + +/* + * rsAtomicInc: Thread-safe increment + * + * Atomicly adds one to the value at addr. This is equivalent to rsAtomicAdd(addr, 1). + * + * Parameters: + * addr: Address of the value to increment. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicInc(volatile int32_t* addr); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicInc(volatile uint32_t* addr); +#endif + +/* + * rsAtomicMax: Thread-safe maximum + * + * Atomicly sets the value at addr to the maximum of *addr and value, i.e. + * *addr = max(*addr, value). + * + * Parameters: + * addr: Address of the value to modify. + * value: Comparison value. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern uint32_t __attribute__((overloadable)) + rsAtomicMax(volatile uint32_t* addr, uint32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicMax(volatile int32_t* addr, int32_t value); +#endif + +/* + * rsAtomicMin: Thread-safe minimum + * + * Atomicly sets the value at addr to the minimum of *addr and value, i.e. + * *addr = min(*addr, value). + * + * Parameters: + * addr: Address of the value to modify. + * value: Comparison value. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern uint32_t __attribute__((overloadable)) + rsAtomicMin(volatile uint32_t* addr, uint32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicMin(volatile int32_t* addr, int32_t value); +#endif + +/* + * rsAtomicOr: Thread-safe bitwise or + * + * Atomicly perform a bitwise or two values, storing the result at addr, + * i.e. *addr |= value. + * + * Parameters: + * addr: Address of the value to modify. + * value: Value to or with. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicOr(volatile int32_t* addr, int32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicOr(volatile uint32_t* addr, uint32_t value); +#endif + +/* + * rsAtomicSub: Thread-safe subtraction + * + * Atomicly subtracts a value from the value at addr, i.e. *addr -= value. + * + * Parameters: + * addr: Address of the value to modify. + * value: Amount to subtract. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicSub(volatile int32_t* addr, int32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicSub(volatile uint32_t* addr, uint32_t value); +#endif + +/* + * rsAtomicXor: Thread-safe bitwise exclusive or + * + * Atomicly performs a bitwise xor of two values, storing the result at addr, + * i.e. *addr ^= value. + * + * Parameters: + * addr: Address of the value to modify. + * value: Value to xor with. + * + * Returns: Value of *addr prior to the operation. + */ +#if (defined(RS_VERSION) && (RS_VERSION >= 14)) +extern int32_t __attribute__((overloadable)) + rsAtomicXor(volatile int32_t* addr, int32_t value); +#endif + +#if (defined(RS_VERSION) && (RS_VERSION >= 20)) +extern int32_t __attribute__((overloadable)) + rsAtomicXor(volatile uint32_t* addr, uint32_t value); +#endif + +#endif // RENDERSCRIPT_RS_ATOMIC_RSH |