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