/*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
#pragma once
+#define FOLLY_PICO_SPIN_LOCK_H_
/*
* @author Keith Adams <kma@fb.com>
*/
#include <array>
+#include <atomic>
#include <cinttypes>
-#include <type_traits>
#include <cstdlib>
-#include <pthread.h>
+#include <folly/Portability.h>
#include <mutex>
-#include <atomic>
+#include <type_traits>
#include <glog/logging.h>
#include <folly/detail/Sleeper.h>
-#include <folly/Portability.h>
#if !FOLLY_X64 && !FOLLY_A64 && !FOLLY_PPC64
# error "PicoSpinLock.h is currently x64, aarch64 and ppc64 only."
*/
void init(IntType initialValue = 0) {
CHECK(!(initialValue & kLockBitMask_));
- lock_ = initialValue;
+ lock_ = UIntType(initialValue);
}
/*
*/
void setData(IntType w) {
CHECK(!(w & kLockBitMask_));
- lock_ = (lock_ & kLockBitMask_) | w;
+ lock_ = UIntType((lock_ & kLockBitMask_) | w);
}
/*
bool try_lock() const {
bool ret = false;
-#if FOLLY_X64
+#ifdef _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
#define FB_DOBTS(size) \
asm volatile("lock; bts" #size " %1, (%2); setnc %0" \
: "=r" (ret) \
* integer.
*/
void unlock() const {
-#if FOLLY_X64
+#ifdef _MSC_VER
+ switch (sizeof(IntType)) {
+ case 2:
+ // There is no _interlockedbittestandreset16 for some reason :(
+ _InterlockedAnd16((volatile short*)&lock_, (short)~kLockBitMask_);
+ break;
+ case 4:
+ _interlockedbittestandreset((volatile long*)&lock_, Bit);
+ break;
+ case 8:
+ _interlockedbittestandreset64((volatile long long*)&lock_, Bit);
+ break;
+ }
+#elif FOLLY_X64
#define FB_DOBTR(size) \
asm volatile("lock; btr" #size " %0, (%1)" \
: \