1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/container for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #define BOOST_CONTAINER_SOURCE
12 #include <boost/container/detail/config_begin.hpp>
13 #include <boost/container/detail/workaround.hpp>
14 #include <boost/container/detail/thread_mutex.hpp>
15 
16 #include <boost/container/pmr/synchronized_pool_resource.hpp>
17 #include <cstddef>
18 
19 namespace {
20 
21 using namespace boost::container::dtl;
22 
23 class thread_mutex_lock
24 {
25    thread_mutex &m_mut;
26 
27    public:
thread_mutex_lock(thread_mutex & m)28    explicit thread_mutex_lock(thread_mutex &m)
29       : m_mut(m)
30    {
31       m_mut.lock();
32    }
33 
~thread_mutex_lock()34    ~thread_mutex_lock()
35    {
36       m_mut.unlock();
37    }
38 };
39 
40 }  //namespace {
41 
42 namespace boost {
43 namespace container {
44 namespace pmr {
45 
synchronized_pool_resource(const pool_options & opts,memory_resource * upstream)46 synchronized_pool_resource::synchronized_pool_resource(const pool_options& opts, memory_resource* upstream) BOOST_NOEXCEPT
47    : m_mut(), m_pool_resource(opts, upstream)
48 {}
49 
synchronized_pool_resource()50 synchronized_pool_resource::synchronized_pool_resource() BOOST_NOEXCEPT
51    : m_mut(), m_pool_resource()
52 {}
53 
synchronized_pool_resource(memory_resource * upstream)54 synchronized_pool_resource::synchronized_pool_resource(memory_resource* upstream) BOOST_NOEXCEPT
55    : m_mut(), m_pool_resource(upstream)
56 {}
57 
synchronized_pool_resource(const pool_options & opts)58 synchronized_pool_resource::synchronized_pool_resource(const pool_options& opts) BOOST_NOEXCEPT
59    : m_mut(), m_pool_resource(opts)
60 {}
61 
~synchronized_pool_resource()62 synchronized_pool_resource::~synchronized_pool_resource() //virtual
63 {}
64 
release()65 void synchronized_pool_resource::release()
66 {
67    thread_mutex_lock lck(m_mut); (void)lck;
68    m_pool_resource.release();
69 }
70 
upstream_resource() const71 memory_resource* synchronized_pool_resource::upstream_resource() const
72 {  return m_pool_resource.upstream_resource();  }
73 
options() const74 pool_options synchronized_pool_resource::options() const
75 {  return m_pool_resource.options();  }
76 
do_allocate(std::size_t bytes,std::size_t alignment)77 void* synchronized_pool_resource::do_allocate(std::size_t bytes, std::size_t alignment) //virtual
78 {
79    thread_mutex_lock lck(m_mut); (void)lck;
80    return m_pool_resource.do_allocate(bytes, alignment);
81 }
82 
do_deallocate(void * p,std::size_t bytes,std::size_t alignment)83 void synchronized_pool_resource::do_deallocate(void* p, std::size_t bytes, std::size_t alignment) //virtual
84 {
85    thread_mutex_lock lck(m_mut); (void)lck;
86    return m_pool_resource.do_deallocate(p, bytes, alignment);
87 }
88 
do_is_equal(const memory_resource & other) const89 bool synchronized_pool_resource::do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT //virtual
90 {  return this == dynamic_cast<const synchronized_pool_resource*>(&other);  }
91 
pool_count() const92 std::size_t synchronized_pool_resource::pool_count() const
93 {  return m_pool_resource.pool_count();  }
94 
pool_index(std::size_t bytes) const95 std::size_t synchronized_pool_resource::pool_index(std::size_t bytes) const
96 {  return m_pool_resource.pool_index(bytes);  }
97 
pool_next_blocks_per_chunk(std::size_t pool_idx) const98 std::size_t synchronized_pool_resource::pool_next_blocks_per_chunk(std::size_t pool_idx) const
99 {  return m_pool_resource.pool_next_blocks_per_chunk(pool_idx);  }
100 
pool_block(std::size_t pool_idx) const101 std::size_t synchronized_pool_resource::pool_block(std::size_t pool_idx) const
102 {  return m_pool_resource.pool_block(pool_idx);  }
103 
pool_cached_blocks(std::size_t pool_idx) const104 std::size_t synchronized_pool_resource::pool_cached_blocks(std::size_t pool_idx) const
105 {  return m_pool_resource.pool_cached_blocks(pool_idx);  }
106 
107 }  //namespace pmr {
108 }  //namespace container {
109 }  //namespace boost {
110 
111 #include <boost/container/detail/config_end.hpp>
112