Proper try_lock semantics.

[SVN r44132]
This commit is contained in:
Peter Dimov
2008-04-09 17:49:20 +00:00
parent 748b1baee8
commit b4885a1dd6

View File

@ -15,6 +15,8 @@
// http://www.boost.org/LICENSE_1_0.txt) // http://www.boost.org/LICENSE_1_0.txt)
// //
#include <boost/assert.hpp>
namespace boost namespace boost
{ {
@ -23,19 +25,35 @@ namespace detail
class spinlock class spinlock
{ {
public:
bool locked_;
public: public:
inline bool try_lock() inline bool try_lock()
{ {
return true; if( locked_ )
{
return false;
}
else
{
locked_ = true;
return true;
}
} }
inline void lock() inline void lock()
{ {
BOOST_ASSERT( !locked_ );
locked_ = true;
} }
inline void unlock() inline void unlock()
{ {
BOOST_ASSERT( locked_ );
locked_ = false;
} }
public: public:
@ -44,17 +62,21 @@ public:
{ {
private: private:
spinlock & sp_;
scoped_lock( scoped_lock const & ); scoped_lock( scoped_lock const & );
scoped_lock & operator=( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & );
public: public:
explicit scoped_lock( spinlock & /*sp*/ ) explicit scoped_lock( spinlock & sp ): sp_( sp )
{ {
sp.lock();
} }
~scoped_lock() ~scoped_lock()
{ {
sp_.unlock();
} }
}; };
}; };
@ -62,6 +84,6 @@ public:
} // namespace detail } // namespace detail
} // namespace boost } // namespace boost
#define BOOST_DETAIL_SPINLOCK_INIT {} #define BOOST_DETAIL_SPINLOCK_INIT { false }
#endif // #ifndef BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED #endif // #ifndef BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED