Implement std::pmr::synchronized_pool_resource
commit94fd7e5dda96b1bfc9f140a441f3f9296d2923f9
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2018 23:35:44 +0000 (17 23:35 +0000)
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2018 23:35:44 +0000 (17 23:35 +0000)
treefb731c4af3dad3470490f611f5941ab972bfa6f9
parenteb995d0edd556bcc973ce30a4711164ef7b361cc
Implement std::pmr::synchronized_pool_resource

Define the thread-safe pool resource, using a shared_mutex to allow
multiple threads to concurrently allocate from thread-specific pools.

Define new weak symbols for the pthread_rwlock_t functions, to avoid
making libstdc++.so depend on libpthread.so

When the necessary Gthread support is absent only define the
feature-test macro to 1, rather than 201603. This is intended to imply
incomplete support, because everything except synchronized_pool_resource
works.

Implement std::pmr::synchronized_pool_resource
* config/abi/pre/gnu.ver: Add new symbols.
* include/std/memory_resource [_GLIBCXX_HAS_GTHREADS]
(__cpp_lib_memory_resource): Define to expected value, 201603.
(synchronized_pool_resource): New class.
[!_GLIBCXX_HAS_GTHREADS] (__cpp_lib_memory_resource): Define to 1.
* include/std/shared_mutex (__glibcxx_rwlock_rdlock)
(__glibcxx_rwlock_tryrdlock, __glibcxx_rwlock_wrlock)
(__glibcxx_rwlock_trywrlock, __glibcxx_rwlock_unlock)
(__glibcxx_rwlock_destroy, __glibcxx_rwlock_init)
(__glibcxx_rwlock_timedrdlock, __glibcxx_rwlock_timedwrlock): Define
weak symbols for POSIX rwlock functions.
(__shared_mutex_pthread): Use weak symbols.
* include/std/version (__cpp_lib_memory_resource): Define.
* src/c++17/memory_resource.cc [_GLIBCXX_HAS_GTHREADS]
(synchronized_pool_resource::_TPools): New class.
(destroy_TPools): New function for pthread_key_create destructor.
(synchronized_pool_resource::synchronized_pool_resource)
(synchronized_pool_resource::~synchronized_pool_resource)
(synchronized_pool_resource::release)
(synchronized_pool_resource::do_allocate)
(synchronized_pool_resource::do_deallocate): Define public members.
(synchronized_pool_resource::_M_thread_specific_pools)
(synchronized_pool_resource::_M_alloc_tpools)
(synchronized_pool_resource::_M_alloc_shared_tpools): Define private
members.
* testsuite/20_util/synchronized_pool_resource/allocate.cc: New test.
* testsuite/20_util/synchronized_pool_resource/cons.cc: New test.
* testsuite/20_util/synchronized_pool_resource/is_equal.cc: New test.
* testsuite/20_util/synchronized_pool_resource/multithreaded.cc: New
test.
* testsuite/20_util/synchronized_pool_resource/release.cc: New test.
* testsuite/performance/20_util/memory_resource/pools.cc: Add
multithreaded tests using pmr::synchronized_pool_resource.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@266242 138bc75d-0d04-0410-961f-82ee72b054a4
13 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/config/abi/pre/gnu.ver
libstdc++-v3/include/std/memory_resource
libstdc++-v3/include/std/shared_mutex
libstdc++-v3/include/std/version
libstdc++-v3/src/c++17/memory_resource.cc
libstdc++-v3/testsuite/20_util/synchronized_pool_resource/allocate.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/synchronized_pool_resource/cons.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/synchronized_pool_resource/is_equal.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/synchronized_pool_resource/multithreaded.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/synchronized_pool_resource/options.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/synchronized_pool_resource/release.cc [new file with mode: 0644]
libstdc++-v3/testsuite/performance/20_util/memory_resource/pools.cc