From: Stephen Chen Date: Sat, 20 May 2017 03:59:15 +0000 (-0700) Subject: fix PicoSpinLock for aarch64 and allow PackedSyncPtr to compile for aarch64 X-Git-Tag: v2017.05.22.00~2 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=7e04d47528f4ac428741ec41efdc500fb515e4ac 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 --- diff --git a/folly/PackedSyncPtr.h b/folly/PackedSyncPtr.h index 64337674..e11588e8 100644 --- a/folly/PackedSyncPtr.h +++ b/folly/PackedSyncPtr.h @@ -18,8 +18,8 @@ #include -#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 /* diff --git a/folly/PicoSpinLock.h b/folly/PicoSpinLock.h index 8ee98b84..485050f1 100644 --- a/folly/PicoSpinLock.h +++ b/folly/PicoSpinLock.h @@ -171,7 +171,9 @@ struct PicoSpinLock { #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" \ @@ -252,7 +254,7 @@ struct PicoSpinLock { #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" \