+#if defined(FOLLY_SANITIZE_THREAD)
+ // TODO: Might be able to fully move to std::atomic when gcc emits lock btr:
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49244
+ ret =
+ !(reinterpret_cast<std::atomic<UIntType>*>(&lock_)->fetch_or(
+ kLockBitMask_, std::memory_order_acquire) &
+ kLockBitMask_);
+#elif _MSC_VER
+ switch (sizeof(IntType)) {
+ case 2:
+ // There is no _interlockedbittestandset16 for some reason :(
+ ret = _InterlockedOr16(
+ (volatile short*)&lock_, (short)kLockBitMask_) & kLockBitMask_;
+ break;
+ case 4:
+ ret = _interlockedbittestandset((volatile long*)&lock_, Bit);
+ break;
+ case 8:
+ ret = _interlockedbittestandset64((volatile long long*)&lock_, Bit);
+ break;
+ }
+#elif FOLLY_X64