88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED | ||
|  | #define BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED | ||
|  | 
 | ||
|  | // MS compatible compilers support #pragma once | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) && (_MSC_VER >= 1020) | ||
|  | # pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | // | ||
|  | //  Copyright (c) 2008 Peter Dimov | ||
|  | // | ||
|  | //  Distributed under the Boost Software License, Version 1.0. | ||
|  | //  See accompanying file LICENSE_1_0.txt or copy at | ||
|  | //  http://www.boost.org/LICENSE_1_0.txt) | ||
|  | // | ||
|  | 
 | ||
|  | #include <boost/smart_ptr/detail/yield_k.hpp> | ||
|  | 
 | ||
|  | #if defined( __ia64__ ) && defined( __INTEL_COMPILER ) | ||
|  | # include <ia64intrin.h> | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  | 
 | ||
|  | namespace detail | ||
|  | { | ||
|  | 
 | ||
|  | class spinlock | ||
|  | { | ||
|  | public: | ||
|  | 
 | ||
|  |     int v_; | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  |     bool try_lock() | ||
|  |     { | ||
|  |         int r = __sync_lock_test_and_set( &v_, 1 ); | ||
|  |         return r == 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     void lock() | ||
|  |     { | ||
|  |         for( unsigned k = 0; !try_lock(); ++k ) | ||
|  |         { | ||
|  |             boost::detail::yield( k ); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     void unlock() | ||
|  |     { | ||
|  |         __sync_lock_release( &v_ ); | ||
|  |     } | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  |     class scoped_lock | ||
|  |     { | ||
|  |     private: | ||
|  | 
 | ||
|  |         spinlock & sp_; | ||
|  | 
 | ||
|  |         scoped_lock( scoped_lock const & ); | ||
|  |         scoped_lock & operator=( scoped_lock const & ); | ||
|  | 
 | ||
|  |     public: | ||
|  | 
 | ||
|  |         explicit scoped_lock( spinlock & sp ): sp_( sp ) | ||
|  |         { | ||
|  |             sp.lock(); | ||
|  |         } | ||
|  | 
 | ||
|  |         ~scoped_lock() | ||
|  |         { | ||
|  |             sp_.unlock(); | ||
|  |         } | ||
|  |     }; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace detail | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #define BOOST_DETAIL_SPINLOCK_INIT {0} | ||
|  | 
 | ||
|  | #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED |