diff --git a/include/metall/kernel/manager_kernel.hpp b/include/metall/kernel/manager_kernel.hpp index 649c76c6..f5ca062b 100644 --- a/include/metall/kernel/manager_kernel.hpp +++ b/include/metall/kernel/manager_kernel.hpp @@ -486,7 +486,7 @@ class manager_kernel { // Private methods // -------------------- // - bool priv_initialized() const; + void priv_sanity_check() const; bool priv_validate_runtime_configuration() const; difference_type priv_to_offset(const void *const ptr) const; void *priv_to_address(difference_type offset) const; @@ -585,7 +585,6 @@ class manager_kernel { // Private fields // -------------------- // bool m_good{false}; - bool m_open{false}; std::string m_base_dir_path{}; size_type m_vm_region_size{0}; void *m_vm_region{nullptr}; diff --git a/include/metall/kernel/manager_kernel_impl.ipp b/include/metall/kernel/manager_kernel_impl.ipp index efdf48e6..f75b3d8c 100644 --- a/include/metall/kernel/manager_kernel_impl.ipp +++ b/include/metall/kernel/manager_kernel_impl.ipp @@ -58,13 +58,14 @@ bool manager_kernel::open( template void manager_kernel::close() { - // Update m_good - if (priv_initialized()) { + if (m_vm_region) { + priv_sanity_check(); if (!m_segment_storage.read_only()) { priv_serialize_management_data(); m_segment_storage.sync(true); } + m_good = false; m_segment_storage.destroy(); priv_deallocate_segment_header(); priv_release_vm_region(); @@ -78,14 +79,14 @@ void manager_kernel::close() { template void manager_kernel::flush(const bool synchronous) { - assert(priv_initialized()); + priv_sanity_check(); m_segment_storage.sync(synchronous); } template void *manager_kernel::allocate( const manager_kernel::size_type nbytes) { - assert(priv_initialized()); + priv_sanity_check(); if (m_segment_storage.read_only()) return nullptr; const auto offset = m_segment_memory_allocator.allocate(nbytes); @@ -101,7 +102,7 @@ template void *manager_kernel::allocate_aligned( const manager_kernel::size_type nbytes, const manager_kernel::size_type alignment) { - assert(priv_initialized()); + priv_sanity_check(); if (m_segment_storage.read_only()) return nullptr; // This requirement could be removed, but it would need some work to do @@ -122,7 +123,7 @@ void *manager_kernel::allocate_aligned( template void manager_kernel::deallocate(void *addr) { - assert(priv_initialized()); + priv_sanity_check(); if (m_segment_storage.read_only()) return; if (!addr) return; m_segment_memory_allocator.deallocate(priv_to_offset(addr)); @@ -130,7 +131,7 @@ void manager_kernel::deallocate(void *addr) { template bool manager_kernel::all_memory_deallocated() const { - assert(priv_initialized()); + priv_sanity_check(); return m_segment_memory_allocator.all_memory_deallocated(); } @@ -138,7 +139,7 @@ template template std::pair::size_type> manager_kernel::find(char_ptr_holder_type name) const { - assert(priv_initialized()); + priv_sanity_check(); if (name.is_anonymous()) { return std::make_pair(nullptr, 0); @@ -166,7 +167,7 @@ manager_kernel::find(char_ptr_holder_type name) const { template template bool manager_kernel::destroy(char_ptr_holder_type name) { - assert(priv_initialized()); + priv_sanity_check(); if (m_segment_storage.read_only()) return false; if (name.is_anonymous()) { @@ -199,7 +200,7 @@ bool manager_kernel::destroy(char_ptr_holder_type name) { template template bool manager_kernel::destroy_ptr(const T *ptr) { - assert(priv_initialized()); + priv_sanity_check(); if (m_segment_storage.read_only()) return false; size_type length = 0; @@ -425,7 +426,7 @@ template T *manager_kernel::generic_construct( char_ptr_holder_type name, const size_type num, const bool try2find, [[maybe_unused]] const bool do_throw, mdtl::in_place_interface &table) { - assert(priv_initialized()); + priv_sanity_check(); return priv_generic_construct(name, num, try2find, table); } @@ -658,11 +659,15 @@ bool manager_kernel::priv_init_datastore_directory( } template -bool manager_kernel::priv_initialized() const { +void manager_kernel::priv_sanity_check() const { + assert(m_good); assert(!m_base_dir_path.empty()); + assert(m_vm_region_size > 0); + assert(m_vm_region); + assert(m_segment_header); + // TODO: add sanity check functions in other classes assert(m_segment_storage.get_segment()); - return (m_vm_region && m_vm_region_size > 0 && m_segment_header && - m_segment_storage.size() > 0); + assert(m_manager_metadata); } template @@ -1076,7 +1081,7 @@ bool manager_kernel::priv_create( // ---------- For serializing/deserializing ---------- // template bool manager_kernel::priv_serialize_management_data() { - assert(priv_initialized()); + priv_sanity_check(); if (m_segment_storage.read_only()) return true; @@ -1157,7 +1162,7 @@ template bool manager_kernel::priv_snapshot( const char *destination_base_dir_path, const bool clone, const int num_max_copy_threads) { - assert(priv_initialized()); + priv_sanity_check(); m_segment_storage.sync(true); priv_serialize_management_data();