* Clean up constructor template auto deduction guides to use Boost.Container traits

* GitHub #73: '"triviality of pair".

* Fixed race condition bug in unsynchronized_pool_resource
This commit is contained in:
Ion Gaztañaga committed 2018-06-14 13:17:55 +02:00
1 parent 69d42ef636
commit 9a22431578
16 files changed
+532 -109

No files matched your search

+18 -30
View File
@@ -11,31 +11,29 @@
#define BOOST_CONTAINER_SOURCE
#include <boost/container/detail/config_begin.hpp>
#include <boost/container/detail/workaround.hpp>
#include <boost/container/detail/dlmalloc.hpp>
#include <boost/container/detail/thread_mutex.hpp>
#include <boost/container/pmr/synchronized_pool_resource.hpp>
#include <cstddef>
namespace {
using namespace boost::container;
using namespace boost::container::dtl;
class dlmalloc_sync_scoped_lock
class thread_mutex_lock
{
void *m_sync;
thread_mutex &m_mut;
public:
explicit dlmalloc_sync_scoped_lock(void *sync)
: m_sync(sync)
explicit thread_mutex_lock(thread_mutex &m)
: m_mut(m)
{
if(!dlmalloc_sync_lock(m_sync)){
throw_bad_alloc();
}
m_mut.lock();
}
~dlmalloc_sync_scoped_lock()
~thread_mutex_lock()
{
dlmalloc_sync_unlock(m_sync);
m_mut.unlock();
}
};
@@ -46,32 +44,28 @@ namespace container {
namespace pmr {
synchronized_pool_resource::synchronized_pool_resource(const pool_options& opts, memory_resource* upstream) BOOST_NOEXCEPT
: m_pool_resource(opts, upstream), m_opaque_sync()
: m_mut(), m_pool_resource(opts, upstream)
{}
synchronized_pool_resource::synchronized_pool_resource() BOOST_NOEXCEPT
: m_pool_resource(), m_opaque_sync()
: m_mut(), m_pool_resource()
{}
synchronized_pool_resource::synchronized_pool_resource(memory_resource* upstream) BOOST_NOEXCEPT
: m_pool_resource(upstream), m_opaque_sync()
: m_mut(), m_pool_resource(upstream)
{}
synchronized_pool_resource::synchronized_pool_resource(const pool_options& opts) BOOST_NOEXCEPT
: m_pool_resource(opts), m_opaque_sync()
: m_mut(), m_pool_resource(opts)
{}
synchronized_pool_resource::~synchronized_pool_resource() //virtual
{
if(m_opaque_sync)
dlmalloc_sync_destroy(m_opaque_sync);
}
{}
void synchronized_pool_resource::release()
{
if(m_opaque_sync){ //If there is no mutex, no allocation could be done
m_pool_resource.release();
}
thread_mutex_lock lck(m_mut); (void)lck;
m_pool_resource.release();
}
memory_resource* synchronized_pool_resource::upstream_resource() const
@@ -82,19 +76,13 @@ pool_options synchronized_pool_resource::options() const
void* synchronized_pool_resource::do_allocate(std::size_t bytes, std::size_t alignment) //virtual
{
if(!m_opaque_sync){ //If there is no mutex, no allocation could be done
m_opaque_sync = dlmalloc_sync_create();
if(!m_opaque_sync){
throw_bad_alloc();
}
}
dlmalloc_sync_scoped_lock lock(m_opaque_sync); (void)lock;
thread_mutex_lock lck(m_mut); (void)lck;
return m_pool_resource.do_allocate(bytes, alignment);
}
void synchronized_pool_resource::do_deallocate(void* p, std::size_t bytes, std::size_t alignment) //virtual
{
dlmalloc_sync_scoped_lock lock(m_opaque_sync); (void)lock;
thread_mutex_lock lck(m_mut); (void)lck;
return m_pool_resource.do_deallocate(p, bytes, alignment);
}