Merge [75389] to release. Fixes #5372.

[SVN r75753]
This commit is contained in:
Peter Dimov
2011-11-30 17:49:43 +00:00
parent 7b097467d6
commit c846d230f0

View File

@ -2,7 +2,7 @@
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
// //
// Copyright (c) 2008 Peter Dimov // Copyright (c) 2008, 2011 Peter Dimov
// //
// Distributed under the Boost Software License, Version 1.0. // Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at // See accompanying file LICENSE_1_0.txt or copy at
@ -11,6 +11,20 @@
#include <boost/smart_ptr/detail/yield_k.hpp> #include <boost/smart_ptr/detail/yield_k.hpp>
#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
# define BOOST_SP_ARM_BARRIER "dmb"
#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__)
# define BOOST_SP_ARM_BARRIER "mcr p15, 0, r0, c7, c10, 5"
#else
# define BOOST_SP_ARM_BARRIER ""
#endif
namespace boost namespace boost
{ {
@ -30,7 +44,8 @@ public:
int r; int r;
__asm__ __volatile__( __asm__ __volatile__(
"swp %0, %1, [%2]": "swp %0, %1, [%2]\n\t"
BOOST_SP_ARM_BARRIER :
"=&r"( r ): // outputs "=&r"( r ): // outputs
"r"( 1 ), "r"( &v_ ): // inputs "r"( 1 ), "r"( &v_ ): // inputs
"memory", "cc" ); "memory", "cc" );
@ -48,7 +63,7 @@ public:
void unlock() void unlock()
{ {
__asm__ __volatile__( "" ::: "memory" ); __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
*const_cast< int volatile* >( &v_ ) = 0; *const_cast< int volatile* >( &v_ ) = 0;
} }
@ -82,4 +97,6 @@ public:
#define BOOST_DETAIL_SPINLOCK_INIT {0} #define BOOST_DETAIL_SPINLOCK_INIT {0}
#undef BOOST_SP_ARM_BARRIER
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED