| /* |
| * Copyright (C) 2011 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. |
| */ |
| |
| /** @file rs_atomic.rsh |
| * \brief Atomic routines |
| * |
| * |
| */ |
| |
| #ifndef __RS_ATOMIC_RSH__ |
| #define __RS_ATOMIC_RSH__ |
| |
| #if (defined(RS_VERSION) && (RS_VERSION >= 14)) |
| |
| /** |
| * Atomic add one to the value at addr. |
| * Equal to rsAtomicAdd(addr, 1) |
| * |
| * @param addr Address of value to increment |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicInc(volatile int32_t* addr); |
| /** |
| * Atomic add one to the value at addr. |
| * Equal to rsAtomicAdd(addr, 1) |
| * |
| * @param addr Address of value to increment |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicInc(volatile uint32_t* addr); |
| |
| /** |
| * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1) |
| * |
| * @param addr Address of value to decrement |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicDec(volatile int32_t* addr); |
| /** |
| * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1) |
| * |
| * @param addr Address of value to decrement |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicDec(volatile uint32_t* addr); |
| |
| /** |
| * Atomic add a value to the value at addr. addr[0] += value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to add to the value at addr |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicAdd(volatile int32_t* addr, int32_t value); |
| /** |
| * Atomic add a value to the value at addr. addr[0] += value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to add to the value at addr |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicAdd(volatile uint32_t* addr, uint32_t value); |
| |
| /** |
| * Atomic Subtract a value from the value at addr. addr[0] -= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to subtract from the value at addr |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicSub(volatile int32_t* addr, int32_t value); |
| /** |
| * Atomic Subtract a value from the value at addr. addr[0] -= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to subtract from the value at addr |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicSub(volatile uint32_t* addr, uint32_t value); |
| |
| /** |
| * Atomic Bitwise and a value from the value at addr. addr[0] &= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to and with the value at addr |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicAnd(volatile int32_t* addr, int32_t value); |
| /** |
| * Atomic Bitwise and a value from the value at addr. addr[0] &= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to and with the value at addr |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicAnd(volatile uint32_t* addr, uint32_t value); |
| |
| /** |
| * Atomic Bitwise or a value from the value at addr. addr[0] |= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to or with the value at addr |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicOr(volatile int32_t* addr, int32_t value); |
| /** |
| * Atomic Bitwise or a value from the value at addr. addr[0] |= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to or with the value at addr |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicOr(volatile uint32_t* addr, uint32_t value); |
| |
| /** |
| * Atomic Bitwise xor a value from the value at addr. addr[0] ^= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to xor with the value at addr |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicXor(volatile uint32_t* addr, uint32_t value); |
| /** |
| * Atomic Bitwise xor a value from the value at addr. addr[0] ^= value |
| * |
| * @param addr Address of value to modify |
| * @param value Amount to xor with the value at addr |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicXor(volatile int32_t* addr, int32_t value); |
| |
| /** |
| * Atomic Set the value at addr to the min of addr and value |
| * addr[0] = rsMin(addr[0], value) |
| * |
| * @param addr Address of value to modify |
| * @param value comparison value |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicMin(volatile uint32_t* addr, uint32_t value); |
| /** |
| * Atomic Set the value at addr to the min of addr and value |
| * addr[0] = rsMin(addr[0], value) |
| * |
| * @param addr Address of value to modify |
| * @param value comparison value |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicMin(volatile int32_t* addr, int32_t value); |
| |
| /** |
| * Atomic Set the value at addr to the max of addr and value |
| * addr[0] = rsMax(addr[0], value) |
| * |
| * @param addr Address of value to modify |
| * @param value comparison value |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicMax(volatile uint32_t* addr, uint32_t value); |
| /** |
| * Atomic Set the value at addr to the max of addr and value |
| * addr[0] = rsMin(addr[0], value) |
| * |
| * @param addr Address of value to modify |
| * @param value comparison value |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicMax(volatile int32_t* addr, int32_t value); |
| |
| /** |
| * Compare-and-set operation with a full memory barrier. |
| * |
| * If the value at addr matches compareValue then newValue is written. |
| * |
| * @param addr The address to compare and replace if the compare passes. |
| * @param compareValue The value to test addr[0] against. |
| * @param newValue The value to write if the test passes. |
| * |
| * @return old value |
| */ |
| extern int32_t __attribute__((overloadable)) |
| rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); |
| |
| /** |
| * Compare-and-set operation with a full memory barrier. |
| * |
| * If the value at addr matches compareValue then newValue is written. |
| * |
| * @param addr The address to compare and replace if the compare passes. |
| * @param compareValue The value to test addr[0] against. |
| * @param newValue The value to write if the test passes. |
| * |
| * @return old value |
| */ |
| extern uint32_t __attribute__((overloadable)) |
| rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); |
| |
| #endif //defined(RS_VERSION) && (RS_VERSION >= 14) |
| |
| #endif |
| |