| /* |
| * Copyright (C) 2015 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: The address of the value to compare and replace if the test passes. |
| * compareValue: The value to test *addr against. |
| * newValue: The 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 |