From 85454b952f0945815f5a78cac9a61b71b97195c4 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Thu, 15 Aug 2024 17:55:31 -0400 Subject: [PATCH 1/3] Remove comments. --- src/messages/block.cpp | 47 ------------------------------------------ 1 file changed, 47 deletions(-) diff --git a/src/messages/block.cpp b/src/messages/block.cpp index e84f8618d..dfbd66603 100644 --- a/src/messages/block.cpp +++ b/src/messages/block.cpp @@ -98,69 +98,22 @@ typename block::cptr block::deserialize(uint32_t version, typename block::cptr block::deserialize(arena& arena, uint32_t version, const data_chunk& data, bool witness) NOEXCEPT { - ////if (version < version_minimum || version > version_maximum) - //// nullptr; - - // TODO: arena::initialize(). - // Returns current arena address (next allocation point). - // This implies a linear allocator, otherwise nullptr returned. const auto begin = pointer_cast(arena.initialize()); if (is_null(begin)) return nullptr; istream source{ data }; byte_reader reader{ source, &arena }; - - // block and all of its parts are allocated at the start of arena. - ////auto allocator = reader.get_allocator(); - ////const auto raw = allocator.new_object(reader, witness); - ////if (is_null(raw) || !reader) - //// return nullptr; const auto message = to_shared(deserialize(version, reader, witness)); if (!reader) return nullptr; - // Copy header and tx hashes into preallocated optionals. set_hashes(*message->block_ptr, data); - - // Compute allocated size of raw and its block. const auto end = pointer_cast(arena.allocate(zero)); const auto allocation = std::distance(begin, end); const auto size = possible_narrow_sign_cast(allocation); message->block_ptr->set_allocation(size); - - // Invokes destruct and deallocate (which may not need to free memory). - ////return std::make_shared(std::shared_ptr(raw, - //// allocator.deleter())); return message; - - // Allocate memory for copy of block_ptr and its block, and define deleter. - ////const auto copy = pointer_cast(std::malloc(size)); - ////if (is_null(copy)) - //// return nullptr; - //// - // Copy the contiguous byte buffer that represents the block. - ////std::memcpy(copy, block_ptr, size); - //// - // Do not invoke block destructor, no free required for linear allocator. - ////allocator.deleter()(block_ptr); - ////std::free(copy); - //// - ////const auto thread = std::this_thread::get_id(); - ////const auto wiper = [thread](void* memory) NOEXCEPT - ////{ - //// if (std::this_thread::get_id() != thread) - //// { - //// std::free(memory); - //// } - ////}; - //// - // This leaks copy if destruct on same thread. - ////return std::make_shared(std::shared_ptr(copy, wiper)); - //// - // Create an owning block pointer with deallocator and assign to message. - ////const auto wiper = [](void* address) NOEXCEPT { std::free(address); }; - ////return std::make_shared(std::shared_ptr(copy, wiper)); } // static From 4d78602bb13424476dc25510087b705411eea553 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Fri, 16 Aug 2024 02:40:31 -0400 Subject: [PATCH 2/3] Custom allocate block object and bypass block destructor. --- src/messages/block.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/messages/block.cpp b/src/messages/block.cpp index dfbd66603..17e90eba7 100644 --- a/src/messages/block.cpp +++ b/src/messages/block.cpp @@ -98,22 +98,28 @@ typename block::cptr block::deserialize(uint32_t version, typename block::cptr block::deserialize(arena& arena, uint32_t version, const data_chunk& data, bool witness) NOEXCEPT { + if (version < version_minimum || version > version_maximum) + return nullptr; + const auto begin = pointer_cast(arena.initialize()); if (is_null(begin)) return nullptr; istream source{ data }; byte_reader reader{ source, &arena }; - const auto message = to_shared(deserialize(version, reader, witness)); - if (!reader) + auto allocator = reader.get_allocator(); + const auto raw = allocator.new_object(reader, witness); + if (is_null(raw) || !reader) return nullptr; - set_hashes(*message->block_ptr, data); + set_hashes(*raw, data); const auto end = pointer_cast(arena.allocate(zero)); const auto allocation = std::distance(begin, end); const auto size = possible_narrow_sign_cast(allocation); - message->block_ptr->set_allocation(size); - return message; + raw->set_allocation(size); + ////const auto deleter = allocator.deleter(); + const auto deleter = [](auto) {}; + return to_shared(std::shared_ptr(raw, deleter)); } // static From e0474f42f4de17b8b8ce1d18560ae8861ec976c6 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sun, 18 Aug 2024 13:06:15 -0400 Subject: [PATCH 3/3] Comments. --- src/messages/block.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/messages/block.cpp b/src/messages/block.cpp index 17e90eba7..2270bcb46 100644 --- a/src/messages/block.cpp +++ b/src/messages/block.cpp @@ -94,7 +94,8 @@ typename block::cptr block::deserialize(uint32_t version, // static // WARNING: linear arena must allocate a maximal block and all contents. -// WARNING: chain::block::cptr destruct frees all contained shared_ptr objects. +// WARNING: the block_allocator block becomes invalidated once this method is +// WARNING: called subsequently on the same thread. typename block::cptr block::deserialize(arena& arena, uint32_t version, const data_chunk& data, bool witness) NOEXCEPT { @@ -107,19 +108,19 @@ typename block::cptr block::deserialize(arena& arena, uint32_t version, istream source{ data }; byte_reader reader{ source, &arena }; - auto allocator = reader.get_allocator(); + auto& allocator = reader.get_allocator(); const auto raw = allocator.new_object(reader, witness); if (is_null(raw) || !reader) return nullptr; set_hashes(*raw, data); const auto end = pointer_cast(arena.allocate(zero)); - const auto allocation = std::distance(begin, end); - const auto size = possible_narrow_sign_cast(allocation); - raw->set_allocation(size); - ////const auto deleter = allocator.deleter(); - const auto deleter = [](auto) {}; - return to_shared(std::shared_ptr(raw, deleter)); + const auto size = std::distance(begin, end); + raw->set_allocation(possible_narrow_sign_cast(size)); + + // All block and contained object destructors should be optimized out. + return to_shared(std::shared_ptr(raw, + allocator.deleter())); } // static