1 #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED 2 #define BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED 3 4 // MS compatible compilers support #pragma once 5 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020) 7 # pragma once 8 #endif 9 10 // 11 // Copyright (c) 2008 Peter Dimov 12 // 13 // Distributed under the Boost Software License, Version 1.0. 14 // See accompanying file LICENSE_1_0.txt or copy at 15 // http://www.boost.org/LICENSE_1_0.txt) 16 // 17 18 #include <boost/assert.hpp> 19 20 namespace boost 21 { 22 23 namespace detail 24 { 25 26 class spinlock 27 { 28 public: 29 30 bool locked_; 31 32 public: 33 try_lock()34 inline bool try_lock() 35 { 36 if( locked_ ) 37 { 38 return false; 39 } 40 else 41 { 42 locked_ = true; 43 return true; 44 } 45 } 46 lock()47 inline void lock() 48 { 49 BOOST_ASSERT( !locked_ ); 50 locked_ = true; 51 } 52 unlock()53 inline void unlock() 54 { 55 BOOST_ASSERT( locked_ ); 56 locked_ = false; 57 } 58 59 public: 60 61 class scoped_lock 62 { 63 private: 64 65 spinlock & sp_; 66 67 scoped_lock( scoped_lock const & ); 68 scoped_lock & operator=( scoped_lock const & ); 69 70 public: 71 scoped_lock(spinlock & sp)72 explicit scoped_lock( spinlock & sp ): sp_( sp ) 73 { 74 sp.lock(); 75 } 76 ~scoped_lock()77 ~scoped_lock() 78 { 79 sp_.unlock(); 80 } 81 }; 82 }; 83 84 } // namespace detail 85 } // namespace boost 86 87 #define BOOST_DETAIL_SPINLOCK_INIT { false } 88 89 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED 90