X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=vm%2FAtomic.h;h=becbeeb585ee2a98b2ee73b65bee6e3df0600429;hb=45184254bbe33f01e4933a6713c2f2bc6e78f4ce;hp=27a5ea08103984222f0619a7aeb14ca9d24fd833;hpb=79d2a00ab79b07f4a69035f9f7fb922fd0552122;p=android-x86%2Fdalvik.git diff --git a/vm/Atomic.h b/vm/Atomic.h index 27a5ea081..becbeeb58 100644 --- a/vm/Atomic.h +++ b/vm/Atomic.h @@ -17,32 +17,14 @@ /* * Atomic operations */ -#ifndef _DALVIK_ATOMIC -#define _DALVIK_ATOMIC +#ifndef DALVIK_ATOMIC_H_ +#define DALVIK_ATOMIC_H_ #include /* use common Android atomic ops */ #include /* and some uncommon ones */ -/* - * Full memory barrier. Ensures compiler ordering and SMP behavior. - */ -#define MEM_BARRIER() ANDROID_MEMBAR_FULL() - -/* - * 32-bit atomic compare-and-swap macro. Performs a memory barrier - * before the swap (store-release). - * - * If *_addr equals "_old", replace it with "_new" and return nonzero - * (i.e. returns "false" if the operation fails). - * - * Underlying function is currently declared: - * int release_cas(int32_t old, int32_t new, volatile int32_t* addr) - * - * TODO: rename macro to ATOMIC_RELEASE_CAS - */ -#define ATOMIC_CMP_SWAP(_addr, _old, _new) \ - (android_atomic_release_cas((_old), (_new), (_addr)) == 0) - +void dvmQuasiAtomicsStartup(); +void dvmQuasiAtomicsShutdown(); /* * NOTE: Two "quasiatomic" operations on the exact same memory address @@ -51,15 +33,33 @@ * non-quasiatomic operations on the same address, nor about * quasiatomic operations that are performed on partially-overlapping * memory. + * + * Only the "Sync" versions of these provide a memory barrier. + */ + +/* + * Swap the 64-bit value at "addr" with "value". Returns the previous + * value. + */ +extern "C" int64_t dvmQuasiAtomicSwap64(int64_t value, volatile int64_t* addr); + +/* + * Swap the 64-bit value at "addr" with "value". Returns the previous + * value. Provides memory barriers. + */ +extern "C" int64_t dvmQuasiAtomicSwap64Sync(int64_t value, + volatile int64_t* addr); + +/* + * Read the 64-bit value at "addr". */ +extern "C" int64_t dvmQuasiAtomicRead64(volatile const int64_t* addr); /* - * TODO: rename android_quasiatomic_* to dvmQuasiatomic*. Don't want to do - * that yet due to branch merge issues. + * If the value at "addr" is equal to "oldvalue", replace it with "newvalue" + * and return 0. Otherwise, don't swap, and return nonzero. */ -int64_t android_quasiatomic_swap_64(int64_t value, volatile int64_t* addr); -int64_t android_quasiatomic_read_64(volatile int64_t* addr); -int android_quasiatomic_cmpxchg_64(int64_t oldvalue, int64_t newvalue, +int dvmQuasiAtomicCas64(int64_t oldvalue, int64_t newvalue, volatile int64_t* addr); -#endif /*_DALVIK_ATOMIC*/ +#endif // DALVIK_ATOMIC_H_