blob: 29c294a6bfa01e5d1354144e903ab5343798bef1 [file] [log] [blame]
/*
* 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/gen_runtime.
/*
* rs_atomic.rsh: Atomic routines
*
* 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 all done in the right order.
*
* These functions are slower than just doing the non-atomic variants, 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: Old value
*/
#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: Old value
*/
#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 to compare and replace if the compare passes.
* compareValue The value to test *addr against.
* newValue The value to write if the test passes.
*
* Returns: Old value
*/
#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. Equal to rsAtomicSub(addr, 1)
*
* Parameters:
* addr Address of the value to decrement
*
* Returns: Old value
*/
#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. Equal to rsAtomicAdd(addr, 1)
*
* Parameters:
* addr Address of the value to increment
*
* Returns: Old value
*/
#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: Old value
*/
#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: Old value
*/
#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: Old value
*/
#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: Old value
*/
#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: Old value
*/
#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