Tweak atomicops implementation for Mac OS X to compile correctly when __LP64__
is defined. Patch by Ben Karel <eschew@gmail.com>. BUG=54554 TEST= - base_unittests --gtest_filter='AtomicOpsTest.*' - Compile base/string_util.cc (outside of Chromium) as 64-bit code on Mac OS X 10.6. Review URL: http://codereview.chromium.org/6091007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70942 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
1
AUTHORS
1
AUTHORS
@@ -90,3 +90,4 @@ David Benjamin <davidben@mit.edu>
|
|||||||
Sevan Janiyan <venture37@geeklan.co.uk>
|
Sevan Janiyan <venture37@geeklan.co.uk>
|
||||||
Peter Beverloo <peter@lvp-media.com>
|
Peter Beverloo <peter@lvp-media.com>
|
||||||
Lauri Oherd <lauri.oherd@gmail.com>
|
Lauri Oherd <lauri.oherd@gmail.com>
|
||||||
|
Ben Karel <eschew@gmail.com>
|
||||||
|
@@ -110,7 +110,7 @@ inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr,
|
|||||||
Atomic64 prev_value;
|
Atomic64 prev_value;
|
||||||
do {
|
do {
|
||||||
if (OSAtomicCompareAndSwap64(old_value, new_value,
|
if (OSAtomicCompareAndSwap64(old_value, new_value,
|
||||||
const_cast<Atomic64*>(ptr))) {
|
reinterpret_cast<volatile int64_t*>(ptr))) {
|
||||||
return old_value;
|
return old_value;
|
||||||
}
|
}
|
||||||
prev_value = *ptr;
|
prev_value = *ptr;
|
||||||
@@ -124,18 +124,19 @@ inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr,
|
|||||||
do {
|
do {
|
||||||
old_value = *ptr;
|
old_value = *ptr;
|
||||||
} while (!OSAtomicCompareAndSwap64(old_value, new_value,
|
} while (!OSAtomicCompareAndSwap64(old_value, new_value,
|
||||||
const_cast<Atomic64*>(ptr)));
|
reinterpret_cast<volatile int64_t*>(ptr)));
|
||||||
return old_value;
|
return old_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr,
|
inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr,
|
||||||
Atomic64 increment) {
|
Atomic64 increment) {
|
||||||
return OSAtomicAdd64(increment, const_cast<Atomic64*>(ptr));
|
return OSAtomicAdd64(increment, reinterpret_cast<volatile int64_t*>(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr,
|
inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr,
|
||||||
Atomic64 increment) {
|
Atomic64 increment) {
|
||||||
return OSAtomicAdd64Barrier(increment, const_cast<Atomic64*>(ptr));
|
return OSAtomicAdd64Barrier(increment,
|
||||||
|
reinterpret_cast<volatile int64_t*>(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr,
|
inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr,
|
||||||
@@ -143,8 +144,8 @@ inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr,
|
|||||||
Atomic64 new_value) {
|
Atomic64 new_value) {
|
||||||
Atomic64 prev_value;
|
Atomic64 prev_value;
|
||||||
do {
|
do {
|
||||||
if (OSAtomicCompareAndSwap64Barrier(old_value, new_value,
|
if (OSAtomicCompareAndSwap64Barrier(
|
||||||
const_cast<Atomic64*>(ptr))) {
|
old_value, new_value, reinterpret_cast<volatile int64_t*>(ptr))) {
|
||||||
return old_value;
|
return old_value;
|
||||||
}
|
}
|
||||||
prev_value = *ptr;
|
prev_value = *ptr;
|
||||||
@@ -193,12 +194,11 @@ inline Atomic64 Release_Load(volatile const Atomic64 *ptr) {
|
|||||||
|
|
||||||
// MacOS uses long for intptr_t, AtomicWord and Atomic32 are always different
|
// MacOS uses long for intptr_t, AtomicWord and Atomic32 are always different
|
||||||
// on the Mac, even when they are the same size. We need to explicitly cast
|
// on the Mac, even when they are the same size. We need to explicitly cast
|
||||||
// from AtomicWord to Atomic32/64 to implement the AtomicWord interface.
|
// from AtomicWord to Atomic32 to implement the AtomicWord interface.
|
||||||
#ifdef __LP64__
|
// When in 64-bit mode, AtomicWord is the same as Atomic64, so we need not
|
||||||
#define AtomicWordCastType Atomic64
|
// add duplicate definitions.
|
||||||
#else
|
#ifndef __LP64__
|
||||||
#define AtomicWordCastType Atomic32
|
#define AtomicWordCastType Atomic32
|
||||||
#endif
|
|
||||||
|
|
||||||
inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr,
|
inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr,
|
||||||
AtomicWord old_value,
|
AtomicWord old_value,
|
||||||
@@ -273,6 +273,7 @@ inline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#undef AtomicWordCastType
|
#undef AtomicWordCastType
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace base::subtle
|
} // namespace base::subtle
|
||||||
} // namespace base
|
} // namespace base
|
||||||
|
Reference in New Issue
Block a user