diff options
| author | Jörg Frings-Fürst <debian@jff.email> | 2025-05-02 07:42:02 +0200 |
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff.email> | 2025-05-02 07:42:02 +0200 |
| commit | fc486627a4ecbae797fa6856d8a9204ea85f4db8 (patch) | |
| tree | ff3dae4c0e5d980d8e2da4fc6256ae839269bbcd /libcutl/cutl/details/boost/smart_ptr/detail/spinlock_w32.hpp | |
| parent | 1c188393cd2e271ed2581471b601fb5960777fd8 (diff) | |
| parent | ecba0bbd9947036dd82f16ab95252f8db445e149 (diff) | |
Merge tag 'debian/4.0.0-10' into developdevelop
Bugfix release
Diffstat (limited to 'libcutl/cutl/details/boost/smart_ptr/detail/spinlock_w32.hpp')
| -rw-r--r-- | libcutl/cutl/details/boost/smart_ptr/detail/spinlock_w32.hpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/libcutl/cutl/details/boost/smart_ptr/detail/spinlock_w32.hpp b/libcutl/cutl/details/boost/smart_ptr/detail/spinlock_w32.hpp new file mode 100644 index 0000000..89031c7 --- /dev/null +++ b/libcutl/cutl/details/boost/smart_ptr/detail/spinlock_w32.hpp @@ -0,0 +1,113 @@ +#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED +#define BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_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 <cutl/details/boost/detail/interlocked.hpp> +#include <cutl/details/boost/smart_ptr/detail/yield_k.hpp> + +// BOOST_COMPILER_FENCE + +#if defined(__INTEL_COMPILER) + +#define BOOST_COMPILER_FENCE __memory_barrier(); + +#elif defined( _MSC_VER ) && _MSC_VER >= 1310 + +extern "C" void _ReadWriteBarrier(); +#pragma intrinsic( _ReadWriteBarrier ) + +#define BOOST_COMPILER_FENCE _ReadWriteBarrier(); + +#elif defined(__GNUC__) + +#define BOOST_COMPILER_FENCE __asm__ __volatile__( "" : : : "memory" ); + +#else + +#define BOOST_COMPILER_FENCE + +#endif + +// + +namespace cutl_details_boost +{ + +namespace detail +{ + +class spinlock +{ +public: + + long v_; + +public: + + bool try_lock() + { + long r = BOOST_INTERLOCKED_EXCHANGE( &v_, 1 ); + + BOOST_COMPILER_FENCE + + return r == 0; + } + + void lock() + { + for( unsigned k = 0; !try_lock(); ++k ) + { + cutl_details_boost::detail::yield( k ); + } + } + + void unlock() + { + BOOST_COMPILER_FENCE + *const_cast< long volatile* >( &v_ ) = 0; + } + +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 cutl_details_boost + +#define BOOST_DETAIL_SPINLOCK_INIT {0} + +#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED |
