BUG=5888007 rsAtomicMax/Min did not have proper semantics for unsigned integers. They were always using signed comparisons. rsAtomicCas had the wrong function signature in our math library, leading to no way to properly link/execute it. Change-Id: I336cdd8cd9f2d8093f12e101b55b2797515f039b
251 lines
6.9 KiB
Plaintext
251 lines
6.9 KiB
Plaintext
/*
|
|
* 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
|
|
|