1 #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
2 #define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
5 // Copyright (c) 2008, 2011 Peter Dimov
7 // Distributed under the Boost Software License, Version 1.0.
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
12 #include <boost/smart_ptr/detail/yield_k.hpp>
14 #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
16 # define BOOST_SP_ARM_BARRIER "dmb"
18 #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
20 # define BOOST_SP_ARM_BARRIER "mcr p15, 0, r0, c7, c10, 5"
24 # define BOOST_SP_ARM_BARRIER ""
47 "swp %0, %1, [%2]\n\t"
48 BOOST_SP_ARM_BARRIER :
49 "=&r"( r ): // outputs
50 "r"( 1 ), "r"( &v_ ): // inputs
58 for( unsigned k = 0; !try_lock(); ++k )
60 boost::detail::yield( k );
66 __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
67 *const_cast< int volatile* >( &v_ ) = 0;
78 scoped_lock( scoped_lock const & );
79 scoped_lock & operator=( scoped_lock const & );
83 explicit scoped_lock( spinlock & sp ): sp_( sp )
98 #define BOOST_DETAIL_SPINLOCK_INIT {0}
100 #undef BOOST_SP_ARM_BARRIER
102 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED