atomic.h revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef ANDROID_CUTILS_ATOMIC_H 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_CUTILS_ATOMIC_H 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" { 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * NOTE: memory shared between threads is synchronized by all atomic operations 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * below, this means that no explicit memory barrier is required: all reads or 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * writes issued before android_atomic_* operations are guaranteed to complete 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * before the atomic operation takes place. 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid android_atomic_write(int32_t value, volatile int32_t* addr); 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * all these atomic operations return the previous value 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint32_t android_atomic_inc(volatile int32_t* addr); 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint32_t android_atomic_dec(volatile int32_t* addr); 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint32_t android_atomic_add(int32_t value, volatile int32_t* addr); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint32_t android_atomic_and(int32_t value, volatile int32_t* addr); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint32_t android_atomic_or(int32_t value, volatile int32_t* addr); 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint32_t android_atomic_swap(int32_t value, volatile int32_t* addr); 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * NOTE: Two "quasiatomic" operations on the exact same memory address 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are guaranteed to operate atomically with respect to each other, 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * but no guarantees are made about quasiatomic operations mixed with 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * non-quasiatomic operations on the same address, nor about 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * quasiatomic operations that are performed on partially-overlapping 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * memory. 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint64_t android_quasiatomic_swap_64(int64_t value, volatile int64_t* addr); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint64_t android_quasiatomic_read_64(volatile int64_t* addr); 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * cmpxchg return a non zero value if the exchange was NOT performed, 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * in other words if oldvalue != *addr 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint android_atomic_cmpxchg(int32_t oldvalue, int32_t newvalue, 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project volatile int32_t* addr); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint android_quasiatomic_cmpxchg_64(int64_t oldvalue, int64_t newvalue, 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project volatile int64_t* addr); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} // extern "C" 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ANDROID_CUTILS_ATOMIC_H 80