1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
166a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Atomic operations
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_ATOMIC_H_
21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_ATOMIC_H_
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden#include <cutils/atomic.h>          /* use common Android atomic ops */
246a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden#include <cutils/atomic-inline.h>   /* and some uncommon ones */
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261c92af60b4b6cf1b63c86b29c69c9b54646f915cElliott Hughesvoid dvmQuasiAtomicsStartup();
271c92af60b4b6cf1b63c86b29c69c9b54646f915cElliott Hughesvoid dvmQuasiAtomicsShutdown();
281c92af60b4b6cf1b63c86b29c69c9b54646f915cElliott Hughes
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
306a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden * NOTE: Two "quasiatomic" operations on the exact same memory address
316a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden * are guaranteed to operate atomically with respect to each other,
326a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden * but no guarantees are made about quasiatomic operations mixed with
336a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden * non-quasiatomic operations on the same address, nor about
346a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden * quasiatomic operations that are performed on partially-overlapping
356a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden * memory.
366e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden *
374185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee * Only the "Sync" versions of these provide a memory barrier.
386e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden */
396e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden
406e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden/*
416e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden * Swap the 64-bit value at "addr" with "value".  Returns the previous
426e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden * value.
436e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden */
44d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" int64_t dvmQuasiAtomicSwap64(int64_t value, volatile int64_t* addr);
456e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden
466e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden/*
474185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee * Swap the 64-bit value at "addr" with "value".  Returns the previous
484185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee * value.  Provides memory barriers.
494185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee */
504185972e211b0c84b9fe7d90c56b28cc15e474fabuzbeeextern "C" int64_t dvmQuasiAtomicSwap64Sync(int64_t value,
514185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee                                            volatile int64_t* addr);
524185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee
534185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee/*
546e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden * Read the 64-bit value at "addr".
556a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden */
56d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" int64_t dvmQuasiAtomicRead64(volatile const int64_t* addr);
576a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden
586a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden/*
596e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden * If the value at "addr" is equal to "oldvalue", replace it with "newvalue"
606e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden * and return 0.  Otherwise, don't swap, and return nonzero.
616a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden */
626e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFaddenint dvmQuasiAtomicCas64(int64_t oldvalue, int64_t newvalue,
636a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden        volatile int64_t* addr);
646a877083893fb466ebb6ee6bcbdc5f1ca8609cb1Andy McFadden
65375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_ATOMIC_H_
66