diff options
Diffstat (limited to 'libcxx/src')
| -rw-r--r-- | libcxx/src/memory.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libcxx/src/memory.cpp b/libcxx/src/memory.cpp index e298c723c1e..7caab26c42e 100644 --- a/libcxx/src/memory.cpp +++ b/libcxx/src/memory.cpp @@ -9,6 +9,7 @@ #define _LIBCPP_BUILDING_MEMORY #include "memory" +#include "mutex" _LIBCPP_BEGIN_NAMESPACE_STD @@ -117,6 +118,40 @@ __shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT #endif // _LIBCPP_NO_RTTI +static const std::size_t __sp_mut_count = 16; +static mutex mut_back[__sp_mut_count]; + +_LIBCPP_CONSTEXPR __sp_mut::__sp_mut(void* p) _NOEXCEPT + : _(p) +{ +} + +void +__sp_mut::lock() _NOEXCEPT +{ + reinterpret_cast<mutex*>(_)->lock(); +} + +void +__sp_mut::unlock() _NOEXCEPT +{ + reinterpret_cast<mutex*>(_)->unlock(); +} + +__sp_mut& +__get_sp_mut(const void* p) +{ + static __sp_mut muts[__sp_mut_count] + { + &mut_back[ 0], &mut_back[ 1], &mut_back[ 2], &mut_back[ 3], + &mut_back[ 4], &mut_back[ 5], &mut_back[ 6], &mut_back[ 7], + &mut_back[ 8], &mut_back[ 9], &mut_back[10], &mut_back[11], + &mut_back[12], &mut_back[13], &mut_back[14], &mut_back[15] + }; + return muts[hash<const void*>()(p) & (__sp_mut_count-1)]; +} + + void declare_reachable(void*) { |

