From b4885a1dd6df5aa0e6652123ccc44ca22290fcdd Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 9 Apr 2008 17:49:20 +0000 Subject: [PATCH] Proper try_lock semantics. [SVN r44132] --- include/boost/detail/spinlock_nt.hpp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/include/boost/detail/spinlock_nt.hpp b/include/boost/detail/spinlock_nt.hpp index 106c7e7..f03ba08 100644 --- a/include/boost/detail/spinlock_nt.hpp +++ b/include/boost/detail/spinlock_nt.hpp @@ -15,6 +15,8 @@ // http://www.boost.org/LICENSE_1_0.txt) // +#include + namespace boost { @@ -23,19 +25,35 @@ namespace detail class spinlock { +public: + + bool locked_; + public: inline bool try_lock() { - return true; + if( locked_ ) + { + return false; + } + else + { + locked_ = true; + return true; + } } inline void lock() { + BOOST_ASSERT( !locked_ ); + locked_ = true; } inline void unlock() { + BOOST_ASSERT( locked_ ); + locked_ = false; } public: @@ -44,17 +62,21 @@ public: { private: + spinlock & sp_; + scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: - explicit scoped_lock( spinlock & /*sp*/ ) + explicit scoped_lock( spinlock & sp ): sp_( sp ) { + sp.lock(); } ~scoped_lock() { + sp_.unlock(); } }; }; @@ -62,6 +84,6 @@ public: } // namespace detail } // namespace boost -#define BOOST_DETAIL_SPINLOCK_INIT {} +#define BOOST_DETAIL_SPINLOCK_INIT { false } #endif // #ifndef BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED