diff options
Diffstat (limited to 'src/mongo/util/concurrency/spin_lock.h')
-rw-r--r-- | src/mongo/util/concurrency/spin_lock.h | 110 |
1 files changed, 64 insertions, 46 deletions
diff --git a/src/mongo/util/concurrency/spin_lock.h b/src/mongo/util/concurrency/spin_lock.h index 2343fdc461a..2351e481af2 100644 --- a/src/mongo/util/concurrency/spin_lock.h +++ b/src/mongo/util/concurrency/spin_lock.h @@ -40,56 +40,74 @@ namespace mongo { - /** - * The spinlock currently requires late GCC support routines to be efficient. - * Other platforms default to a mutex implemenation. - */ - class SpinLock : boost::noncopyable { - public: - SpinLock(); - ~SpinLock(); - - static bool isfast(); // true if a real spinlock on this platform - - private: +/** + * The spinlock currently requires late GCC support routines to be efficient. + * Other platforms default to a mutex implemenation. + */ +class SpinLock : boost::noncopyable { +public: + SpinLock(); + ~SpinLock(); + + static bool isfast(); // true if a real spinlock on this platform + +private: #if defined(_WIN32) - CRITICAL_SECTION _cs; - public: - void lock() {EnterCriticalSection(&_cs); } - void unlock() { LeaveCriticalSection(&_cs); } + CRITICAL_SECTION _cs; + +public: + void lock() { + EnterCriticalSection(&_cs); + } + void unlock() { + LeaveCriticalSection(&_cs); + } #elif defined(__USE_XOPEN2K) - pthread_spinlock_t _lock; - void _lk(); - public: - void unlock() { pthread_spin_unlock(&_lock); } - void lock() { - if ( MONGO_likely( pthread_spin_trylock( &_lock ) == 0 ) ) - return; - _lk(); - } + pthread_spinlock_t _lock; + void _lk(); + +public: + void unlock() { + pthread_spin_unlock(&_lock); + } + void lock() { + if (MONGO_likely(pthread_spin_trylock(&_lock) == 0)) + return; + _lk(); + } #elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) - volatile bool _locked; - public: - void unlock() {__sync_lock_release(&_locked); } - void lock(); + volatile bool _locked; + +public: + void unlock() { + __sync_lock_release(&_locked); + } + void lock(); #else - // default to a mutex if not implemented - SimpleMutex _mutex; - public: - void unlock() { _mutex.unlock(); } - void lock() { _mutex.lock(); } + // default to a mutex if not implemented + SimpleMutex _mutex; + +public: + void unlock() { + _mutex.unlock(); + } + void lock() { + _mutex.lock(); + } #endif - }; - - class scoped_spinlock : boost::noncopyable { - public: - scoped_spinlock( SpinLock& l ) : _l(l) { - _l.lock(); - } - ~scoped_spinlock() { - _l.unlock();} - private: - SpinLock& _l; - }; +}; + +class scoped_spinlock : boost::noncopyable { +public: + scoped_spinlock(SpinLock& l) : _l(l) { + _l.lock(); + } + ~scoped_spinlock() { + _l.unlock(); + } + +private: + SpinLock& _l; +}; } // namespace mongo |