1 #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED 2 #define BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_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 <pthread.h> 19 20 namespace boost 21 { 22 23 namespace detail 24 { 25 26 class spinlock 27 { 28 public: 29 30 pthread_mutex_t v_; 31 32 public: 33 try_lock()34 bool try_lock() 35 { 36 return pthread_mutex_trylock( &v_ ) == 0; 37 } 38 lock()39 void lock() 40 { 41 pthread_mutex_lock( &v_ ); 42 } 43 unlock()44 void unlock() 45 { 46 pthread_mutex_unlock( &v_ ); 47 } 48 49 public: 50 51 class scoped_lock 52 { 53 private: 54 55 spinlock & sp_; 56 57 scoped_lock( scoped_lock const & ); 58 scoped_lock & operator=( scoped_lock const & ); 59 60 public: 61 scoped_lock(spinlock & sp)62 explicit scoped_lock( spinlock & sp ): sp_( sp ) 63 { 64 sp.lock(); 65 } 66 ~scoped_lock()67 ~scoped_lock() 68 { 69 sp_.unlock(); 70 } 71 }; 72 }; 73 74 } // namespace detail 75 } // namespace boost 76 77 #define BOOST_DETAIL_SPINLOCK_INIT { PTHREAD_MUTEX_INITIALIZER } 78 79 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED 80