From 38aee22c7d66666c19ffd58e338fed0b3a312e7b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Dumont?= Date: Mon, 3 Oct 2016 20:23:13 +0000 Subject: [PATCH] shared_ptr.cc (mask, [...]): Move declaration... MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2016-10-03 François Dumont * src/c++11/shared_ptr.cc (mask, invalid, get_mutex): Move declaration... * src/c++11/mutex_pool.h: ... here. New. * src/c++11/debug.cc: Use latter. From-SVN: r240732 --- libstdc++-v3/ChangeLog | 7 ++++ libstdc++-v3/src/c++11/debug.cc | 12 +++---- libstdc++-v3/src/c++11/mutex_pool.h | 34 ++++++++++++++++++++ libstdc++-v3/src/c++11/shared_ptr.cc | 48 +++++++++++++++------------- 4 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 libstdc++-v3/src/c++11/mutex_pool.h diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3e5828154b6..65637dc9071 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2016-10-03 François Dumont + + * src/c++11/shared_ptr.cc (mask, invalid, get_mutex): Move + declaration... + * src/c++11/mutex_pool.h: ... here. New. + * src/c++11/debug.cc: Use latter. + 2016-10-03 Jonathan Wakely * doc/xml/manual/status_cxx2017.xml: Update gcd/lcm status. diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index f58e829c47a..0e24d0140dc 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -40,6 +40,8 @@ #include // for __cxa_demangle +#include "mutex_pool.h" + using namespace std; namespace @@ -50,15 +52,13 @@ namespace __gnu_cxx::__mutex& get_safe_base_mutex(void* address) { - const size_t mask = 0xf; - static __gnu_cxx::__mutex safe_base_mutex[mask + 1]; - // Use arbitrarily __gnu_debug::vector as the container giving // alignment of debug containers. const auto alignbits = __builtin_ctz(alignof(__gnu_debug::vector)); - const size_t index - = (reinterpret_cast(address) >> alignbits) & mask; - return safe_base_mutex[index]; + const unsigned char index + = (reinterpret_cast(address) >> alignbits) + & __gnu_internal::mask; + return __gnu_internal::get_mutex(index); } void diff --git a/libstdc++-v3/src/c++11/mutex_pool.h b/libstdc++-v3/src/c++11/mutex_pool.h new file mode 100644 index 00000000000..0addc75bb60 --- /dev/null +++ b/libstdc++-v3/src/c++11/mutex_pool.h @@ -0,0 +1,34 @@ +// Mutex pool used to limit contention -*- C++ -*- + +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +namespace __gnu_internal _GLIBCXX_VISIBILITY(hidden) +{ + const unsigned char mask = 0xf; + const unsigned char invalid = mask + 1; + + /* Returns different instances of __mutex depending on the passed index + * in order to limit contention. + */ + __gnu_cxx::__mutex& get_mutex(unsigned char i); +} diff --git a/libstdc++-v3/src/c++11/shared_ptr.cc b/libstdc++-v3/src/c++11/shared_ptr.cc index 1286ac26a7e..9028040f72d 100644 --- a/libstdc++-v3/src/c++11/shared_ptr.cc +++ b/libstdc++-v3/src/c++11/shared_ptr.cc @@ -24,6 +24,21 @@ #include +#include "mutex_pool.h" + +namespace __gnu_internal _GLIBCXX_VISIBILITY(hidden) +{ + /* Returns different instances of __mutex depending on the passed index + * in order to limit contention. + */ + __gnu_cxx::__mutex& + get_mutex(unsigned char i) + { + static __gnu_cxx::__mutex m[mask + 1]; + return m[i]; + } +} + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -37,21 +52,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef __GTHREADS namespace { - const unsigned char mask = 0xf; - const unsigned char invalid = mask + 1; - inline unsigned char key(const void* addr) - { return _Hash_impl::hash(addr) & mask; } - - /* Returns different instances of __mutex depending on the passed address - * in order to limit contention. - */ - __gnu_cxx::__mutex& - get_mutex(unsigned char i) - { - static __gnu_cxx::__mutex m[mask + 1]; - return m[i]; - } + { return _Hash_impl::hash(addr) & __gnu_internal::mask; } } _Sp_locker::_Sp_locker(const void* p) @@ -59,10 +61,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__gthread_active_p()) { _M_key1 = _M_key2 = key(p); - get_mutex(_M_key1).lock(); + __gnu_internal::get_mutex(_M_key1).lock(); } else - _M_key1 = _M_key2 = invalid; + _M_key1 = _M_key2 = __gnu_internal::invalid; } _Sp_locker::_Sp_locker(const void* p1, const void* p2) @@ -72,22 +74,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_key1 = key(p1); _M_key2 = key(p2); if (_M_key2 < _M_key1) - get_mutex(_M_key2).lock(); - get_mutex(_M_key1).lock(); + __gnu_internal::get_mutex(_M_key2).lock(); + __gnu_internal::get_mutex(_M_key1).lock(); if (_M_key2 > _M_key1) - get_mutex(_M_key2).lock(); + __gnu_internal::get_mutex(_M_key2).lock(); } else - _M_key1 = _M_key2 = invalid; + _M_key1 = _M_key2 = __gnu_internal::invalid; } _Sp_locker::~_Sp_locker() { - if (_M_key1 != invalid) + if (_M_key1 != __gnu_internal::invalid) { - get_mutex(_M_key1).unlock(); + __gnu_internal::get_mutex(_M_key1).unlock(); if (_M_key2 != _M_key1) - get_mutex(_M_key2).unlock(); + __gnu_internal::get_mutex(_M_key2).unlock(); } } #endif -- 2.30.2