Commit 7e04d475 authored by Stephen Chen's avatar Stephen Chen Committed by Facebook Github Bot

fix PicoSpinLock for aarch64 and allow PackedSyncPtr to compile for aarch64

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
parent b3e7df82
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
#include <folly/Portability.h> #include <folly/Portability.h>
#if !FOLLY_X64 && !FOLLY_PPC64 #if !FOLLY_X64 && !FOLLY_PPC64 && !FOLLY_A64
# error "PackedSyncPtr is x64 and ppc64 specific code." # error "PackedSyncPtr is x64, ppc64 or aarch64 specific code."
#endif #endif
/* /*
......
...@@ -171,7 +171,9 @@ struct PicoSpinLock { ...@@ -171,7 +171,9 @@ struct PicoSpinLock {
#undef FB_DOBTS #undef FB_DOBTS
#elif FOLLY_A64 #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 #elif FOLLY_PPC64
#define FB_DOBTS(size) \ #define FB_DOBTS(size) \
asm volatile("\teieio\n" \ asm volatile("\teieio\n" \
...@@ -252,7 +254,7 @@ struct PicoSpinLock { ...@@ -252,7 +254,7 @@ struct PicoSpinLock {
#undef FB_DOBTR #undef FB_DOBTR
#elif FOLLY_A64 #elif FOLLY_A64
__atomic_fetch_and(&lock_, ~(1 << Bit), __ATOMIC_SEQ_CST); __atomic_fetch_and(&lock_, ~kLockBitMask_, __ATOMIC_SEQ_CST);
#elif FOLLY_PPC64 #elif FOLLY_PPC64
#define FB_DOBTR(size) \ #define FB_DOBTR(size) \
asm volatile("\teieio\n" \ asm volatile("\teieio\n" \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment