Summary:
Looks like we never tried to compile or run the PicoSpinLock under aarch64. There were two problems:
if sizeof(IntType) is 64, we try to do
1 << 63
in lock and unlock. This doesn't compile because sizeof(1) is 32.
Also for try_lock, we were returning the data instead of checking for the locked bit.
Reviewed By: djwatson, yfeldblum
Differential Revision:
D5091656
fbshipit-source-id:
4f81b8b32633e87b491548a1a24b9bcf20264063
#include <folly/Portability.h>
-#if !FOLLY_X64 && !FOLLY_PPC64
-# error "PackedSyncPtr is x64 and ppc64 specific code."
+#if !FOLLY_X64 && !FOLLY_PPC64 && !FOLLY_A64
+# error "PackedSyncPtr is x64, ppc64 or aarch64 specific code."
#endif
/*
#undef FB_DOBTS
#elif FOLLY_A64
- ret = __atomic_fetch_or(&lock_, 1 << Bit, __ATOMIC_SEQ_CST);
+ ret =
+ !(__atomic_fetch_or(&lock_, kLockBitMask_, __ATOMIC_SEQ_CST) &
+ kLockBitMask_);
#elif FOLLY_PPC64
#define FB_DOBTS(size) \
asm volatile("\teieio\n" \
#undef FB_DOBTR
#elif FOLLY_A64
- __atomic_fetch_and(&lock_, ~(1 << Bit), __ATOMIC_SEQ_CST);
+ __atomic_fetch_and(&lock_, ~kLockBitMask_, __ATOMIC_SEQ_CST);
#elif FOLLY_PPC64
#define FB_DOBTR(size) \
asm volatile("\teieio\n" \