/*
 * 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: 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
