////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/container for documentation. // ////////////////////////////////////////////////////////////////////////////// #define BOOST_CONTAINER_SOURCE #include #include #include #include //For global lock #include #include namespace boost { namespace container { namespace pmr { class new_delete_resource_imp : public memory_resource { public: virtual ~new_delete_resource_imp() {} virtual void* do_allocate(std::size_t bytes, std::size_t alignment) { return new char[bytes]; (void)bytes; (void)alignment; } virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) { delete[]((char*)p); (void)bytes; (void)alignment; } virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT { return &other == this; } } new_delete_resource_instance; struct null_memory_resource_imp : public memory_resource { public: virtual ~null_memory_resource_imp() {} virtual void* do_allocate(std::size_t bytes, std::size_t alignment) { (void)bytes; (void)alignment; throw_bad_alloc(); return 0; } virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) { (void)p; (void)bytes; (void)alignment; } virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT { return &other == this; } } null_memory_resource_instance; BOOST_CONTAINER_DECL memory_resource* new_delete_resource() BOOST_NOEXCEPT { return &new_delete_resource_instance; } BOOST_CONTAINER_DECL memory_resource* null_memory_resource() BOOST_NOEXCEPT { return &null_memory_resource_instance; } static memory_resource *default_memory_resource = &new_delete_resource_instance; BOOST_CONTAINER_DECL memory_resource* set_default_resource(memory_resource* r) BOOST_NOEXCEPT { //TO-DO: synchronizes-with part using atomics if(dlmalloc_global_sync_lock()){ memory_resource *previous = default_memory_resource; default_memory_resource = r ? r : new_delete_resource(); dlmalloc_global_sync_unlock(); return previous; } else{ return new_delete_resource(); } } BOOST_CONTAINER_DECL memory_resource* get_default_resource() BOOST_NOEXCEPT { //TO-DO: synchronizes-with part using atomics if(dlmalloc_global_sync_lock()){ memory_resource *current = default_memory_resource; dlmalloc_global_sync_unlock(); return current; } else{ return new_delete_resource(); } } } //namespace pmr { } //namespace container { } //namespace boost {