Fix PicoSpinLock on aarch64
authorKeith Daigle <kdaigle@fb.com>
Fri, 15 Dec 2017 22:17:36 +0000 (14:17 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 15 Dec 2017 22:22:33 +0000 (14:22 -0800)
Summary:
Found that building folly on aarch64 gave errors with
picospinlock.  Looked and found that MSVC used casts
so I figured I'd try that

Reviewed By: yfeldblum

Differential Revision: D6504689

fbshipit-source-id: 9565bae5ffab485da407b8609be92ef7db10ab72

folly/PicoSpinLock.h

index 5c63583d451ea15a6110308b73900bf2635afe8e..d9bdf50ce2aaf7c45aea074911afe0fc0d19e952 100644 (file)
@@ -172,9 +172,10 @@ struct PicoSpinLock {
 
 #undef FB_DOBTS
 #elif FOLLY_AARCH64
-    ret =
-        !(__atomic_fetch_or(&lock_, kLockBitMask_, __ATOMIC_SEQ_CST) &
-          kLockBitMask_);
+    using SIntType = typename std::make_signed<UIntType>::type;
+    auto const lock = reinterpret_cast<SIntType*>(&lock_);
+    auto const mask = static_cast<SIntType>(kLockBitMask_);
+    return !(mask & __atomic_fetch_or(lock, mask, __ATOMIC_ACQUIRE));
 #elif FOLLY_PPC64
 #define FB_DOBTS(size)                                 \
     asm volatile("\teieio\n"                           \
@@ -255,7 +256,10 @@ struct PicoSpinLock {
 
 #undef FB_DOBTR
 #elif FOLLY_AARCH64
-    __atomic_fetch_and(&lock_, ~kLockBitMask_, __ATOMIC_SEQ_CST);
+    using SIntType = typename std::make_signed<UIntType>::type;
+    auto const lock = reinterpret_cast<SIntType*>(&lock_);
+    auto const mask = static_cast<SIntType>(kLockBitMask_);
+    __atomic_fetch_and(lock, ~mask, __ATOMIC_RELEASE);
 #elif FOLLY_PPC64
 #define FB_DOBTR(size)                                 \
     asm volatile("\teieio\n"                           \