X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FSpinLock.h;h=76cab06a5e608613bae8e0758895675d204afe21;hb=fbb8a926d8cc510a3ad870b96e1bd38b510034fd;hp=2747a4dbfbef86cb947eca95f1f19b93e08a7bf0;hpb=4494e275ffe1c2bd4a4e59550c325fccbafed139;p=folly.git diff --git a/folly/SpinLock.h b/folly/SpinLock.h index 2747a4db..76cab06a 100644 --- a/folly/SpinLock.h +++ b/folly/SpinLock.h @@ -1,5 +1,5 @@ /* - * Copyright 2014 Facebook, Inc. + * Copyright 2015 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,107 +16,34 @@ #pragma once -#include -#include - -// This is a wrapper SpinLock implementation that works around the -// x64 limitation of the base folly MicroSpinLock. If that is available, this -// simply thinly wraps it. Otherwise, it uses the simplest analog available on -// iOS (or 32-bit Mac) or, failing that, POSIX (on Android et. al.) - -#if __x86_64__ -#include +#include namespace folly { -class SpinLock { - public: - FOLLY_ALWAYS_INLINE SpinLock() { - lock_.init(); - } - FOLLY_ALWAYS_INLINE void lock() const { - lock_.lock(); - } - FOLLY_ALWAYS_INLINE void unlock() const { - lock_.unlock(); - } - FOLLY_ALWAYS_INLINE bool trylock() const { - return lock_.try_lock(); - } - private: - mutable folly::MicroSpinLock lock_; -}; - -} - +#if __x86_64__ +typedef SpinLockMslImpl SpinLock; #elif __APPLE__ -#include - -namespace folly { - -class SpinLock { - public: - FOLLY_ALWAYS_INLINE SpinLock() : lock_(0) {} - FOLLY_ALWAYS_INLINE void lock() const { - OSSpinLockLock(&lock_); - } - FOLLY_ALWAYS_INLINE void unlock() const { - OSSpinLockUnlock(&lock_); - } - FOLLY_ALWAYS_INLINE bool trylock() const { - return OSSpinLockTry(&lock_); - } - private: - mutable OSSpinLock lock_; -}; - -} - +typedef SpinLockAppleImpl SpinLock; +#elif FOLLY_HAVE_PTHREAD_SPINLOCK_T +typedef SpinLockPthreadImpl SpinLock; #else -#include -#include - -namespace folly { - -class SpinLock { - public: - FOLLY_ALWAYS_INLINE SpinLock() { - pthread_mutex_init(&lock_, nullptr); - } - void lock() const { - int rc = pthread_mutex_lock(&lock_); - CHECK_EQ(0, rc); - } - FOLLY_ALWAYS_INLINE void unlock() const { - int rc = pthread_mutex_unlock(&lock_); - CHECK_EQ(0, rc); - } - FOLLY_ALWAYS_INLINE bool trylock() const { - int rc = pthread_mutex_trylock(&lock_); - CHECK_GE(rc, 0); - return rc == 0; - } - private: - mutable pthread_mutex_t lock_; -}; - -} - +typedef SpinLockPthreadMutexImpl SpinLock; #endif -namespace folly { - -class SpinLockGuard : private boost::noncopyable { +template +class SpinLockGuardImpl : private boost::noncopyable { public: - FOLLY_ALWAYS_INLINE explicit SpinLockGuard(SpinLock& lock) : + FOLLY_ALWAYS_INLINE explicit SpinLockGuardImpl(LOCK& lock) : lock_(lock) { lock_.lock(); } - FOLLY_ALWAYS_INLINE ~SpinLockGuard() { + FOLLY_ALWAYS_INLINE ~SpinLockGuardImpl() { lock_.unlock(); } private: - SpinLock& lock_; + LOCK& lock_; }; +typedef SpinLockGuardImpl SpinLockGuard; + }