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