debug container mutex association

François Dumont frs.dumont@gmail.com
Tue Sep 13 20:37:00 GMT 2016


Hi

     When I proposed to change std::hash for pointers my plan was to use 
this approach for the debug containers. So here is the patch leveraging 
on this technique to avoid going through _Hash_impl to hash address and 
get mutex index from it. I think it is obious that new access is faster 
so I didn't wrote a performance test to demonstrate it.

     Drawback is new exported symbols.

     * include/debug/safe_base.h (_Lowest_power_of_two<>): New.
     (_Safe_sequence_base): Make _Safe_iterator_base friend.
     (_Safe_sequence_base::_M_detach_singular(size_t)): New.
     (_Safe_sequence_base::_M_revalidate_singular(size_t)): New.
     (_Safe_sequence_base::_M_swap(_Safe_sequence_base&, size_t)): New.
     (_Safe_sequence_base::_M_get_mutex(size_t)): New.
     (_Safe_iterator_base::_M_get_mutex(size_t)): New.
     (_Safe_iterator_base::_M_attach(_Safe_sequence_base*, bool, size_t)):
     New.
     (_Safe_iterator_base::_M_detach(size_t)): New.
     (_Safe_iterator_base(const _Safe_sequence_base*, bool)): Replace by...
     (_Safe_iterator_base(const _Safe_sequence_base*, bool, size_t)):
     ...this.
     (_Safe_iterator_base(const _Safe_iterator_base&, bool)): Replace by...
     (_Safe_iterator_base(const _Safe_iterator_base&, bool, size_t)):
     ...this.
     (~_Safe_iterator_base()): Delete.
     * include/debug/bitset (bitset::_S_alignment()): New.
     (bitset::reference::~reference()): New.
     (bitset::reference::reference(const _Base_ref&, bitset*)): Adapt.
     (bitset::reference::reference(const reference&)): Adapt.
     * include/debug/safe_iterator.h (_Safe_iterator::_M_get_mutex()): New.
     (_Safe_iterator::_Safe_iterator(const _Iterator&,
     const _Safe_sequence_base*)): Adapt.
     (_Safe_iterator::~_Safe_iterator()): New.
     (_Safe_iterator::_M_detach()): New.
     (_Safe_iterator::_M_attach(_Safe_sequence_base*)): Adapt.
     * include/debug/safe_iterator.tcc: Remove trailing line.
     * include/debug/safe_local_iterator.h (_Safe_local_iterator<>): Rename
     _Sequence template parameter into _Container.
     (_Safe_local_iterator::_M_get_mutex()): New.
     (_Safe_local_iterator::_Safe_local_iterator(const _Iterator&,
     const _Safe_sequence_base*)): Adapt.
     (_Safe_local_iterator::~_Safe_local_iterator()): New.
     (_Safe_local_iterator::_M_detach()): New.
     (_Safe_local_iterator::_M_attach(_Safe_sequence_base*)): Adapt.
     * include/debug/safe_sequence.h
     (_Safe_sequence::_S_alignment()): New.
     (_Safe_sequence::_Safe_sequence(_Safe_sequence&&)): New.
     (_Safe_sequence::_M_get_mutex()): New.
     (_Safe_sequence::_M_detach_singular()): New.
     (_Safe_sequence::_M_revalidate_singular()): New.
     (_Safe_sequence::_M_swap(_Safe_sequence&)): New.
     * include/debug/safe_unordered_base.h
     (_Safe_local_iterator_base(const _Safe_sequence_base*, bool)): Replace
     by...
     (_Safe_local_iterator_base(const _Safe_sequence_base*, bool, size_t)):
     ...this.
     (_Safe_local_iterator_base(const _Safe_local_iterator&, bool)): Replace
     by...
     (_Safe_local_iterator_base(const _Safe_local_iterator&, bool, size_t)):
     ...this.
     (_Safe_local_iterator_base::~_Safe_local_iterator_base()): Delete.
     (_Safe_local_iterator_base::_M_attach(_Safe_sequence_base*, bool,
     size_t)): New.
     (_Safe_local_iterator_base::_M_detach(size_t)): New.
(_Safe_unordered_container_base(_Safe_unordered_container_base&&)):
     Delete.
     (_Safe_unordered_container_base::_M_swap(
     _Safe_unordered_container_base&, size_t)): New.
(_Safe_unordered_container_base::_M_attach_local(_Safe_iterator_base*,
     bool, size_t)): New.
(_Safe_unordered_container_base::_M_detach_local(_Safe_iterator_base*,
     size_t)): New.
     * include/debug/safe_unordered_container.h
     (_Safe_unordered_container::_S_alignment()): New.
     (_Safe_unordered_container::_Safe_unordered_container(
     _Safe_unordered_container&&)): New.
     (_Safe_unordered_container::_M_get_mutex()): New.
(_Safe_unordered_container::_M_swap(_Safe_unordered_container&)): New.
     * src/c++11/debug.cc: Adapt.
     * testsuite/23_containers/vector/debug/mutex_association.cc: New.
     * config/abi/pre/gnu.ver: Add new symbols.

Tested under Linux x86_64.

François


-------------- next part --------------
A non-text attachment was scrubbed...
Name: debug_mutex.patch
Type: text/x-patch
Size: 44407 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20160913/752b50d9/attachment.bin>


More information about the Gcc-patches mailing list