diff options
Diffstat (limited to 'libcxx/include/__memory_resource/synchronized_pool_resource.h')
| -rw-r--r-- | libcxx/include/__memory_resource/synchronized_pool_resource.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/libcxx/include/__memory_resource/synchronized_pool_resource.h b/libcxx/include/__memory_resource/synchronized_pool_resource.h new file mode 100644 index 000000000000..1877147ca16f --- /dev/null +++ b/libcxx/include/__memory_resource/synchronized_pool_resource.h @@ -0,0 +1,94 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___MEMORY_RESOURCE_SYNCHRONIZED_POOL_RESOURCE_H +#define _LIBCPP___MEMORY_RESOURCE_SYNCHRONIZED_POOL_RESOURCE_H + +#include <__config> +#include <__memory_resource/memory_resource.h> +#include <__memory_resource/pool_options.h> +#include <__memory_resource/unsynchronized_pool_resource.h> +#include <cstddef> +#if !defined(_LIBCPP_HAS_NO_THREADS) +# include <mutex> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 14 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace pmr { + +// [mem.res.pool.overview] + +class _LIBCPP_TYPE_VIS synchronized_pool_resource : public memory_resource { +public: + _LIBCPP_HIDE_FROM_ABI synchronized_pool_resource(const pool_options& __opts, memory_resource* __upstream) + : __unsync_(__opts, __upstream) {} + + _LIBCPP_HIDE_FROM_ABI synchronized_pool_resource() + : synchronized_pool_resource(pool_options(), get_default_resource()) {} + + _LIBCPP_HIDE_FROM_ABI explicit synchronized_pool_resource(memory_resource* __upstream) + : synchronized_pool_resource(pool_options(), __upstream) {} + + _LIBCPP_HIDE_FROM_ABI explicit synchronized_pool_resource(const pool_options& __opts) + : synchronized_pool_resource(__opts, get_default_resource()) {} + + synchronized_pool_resource(const synchronized_pool_resource&) = delete; + + ~synchronized_pool_resource() override = default; + + synchronized_pool_resource& operator=(const synchronized_pool_resource&) = delete; + + _LIBCPP_HIDE_FROM_ABI void release() { +# if !defined(_LIBCPP_HAS_NO_THREADS) + unique_lock<mutex> __lk(__mut_); +# endif + __unsync_.release(); + } + + _LIBCPP_HIDE_FROM_ABI memory_resource* upstream_resource() const { return __unsync_.upstream_resource(); } + + _LIBCPP_HIDE_FROM_ABI pool_options options() const { return __unsync_.options(); } + +protected: + _LIBCPP_HIDE_FROM_ABI_VIRTUAL void* do_allocate(size_t __bytes, size_t __align) override { +# if !defined(_LIBCPP_HAS_NO_THREADS) + unique_lock<mutex> __lk(__mut_); +# endif + return __unsync_.allocate(__bytes, __align); + } + + _LIBCPP_HIDE_FROM_ABI_VIRTUAL void do_deallocate(void* __p, size_t __bytes, size_t __align) override { +# if !defined(_LIBCPP_HAS_NO_THREADS) + unique_lock<mutex> __lk(__mut_); +# endif + return __unsync_.deallocate(__p, __bytes, __align); + } + + bool do_is_equal(const memory_resource& __other) const noexcept override; // key function + +private: +# if !defined(_LIBCPP_HAS_NO_THREADS) + mutex __mut_; +# endif + unsynchronized_pool_resource __unsync_; +}; + +} // namespace pmr + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 14 + +#endif // _LIBCPP___MEMORY_RESOURCE_SYNCHRONIZED_POOL_RESOURCE_H |
