From b0ac9ef70a868d7bef2322b5c4274e3c0dbc7a6f Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 18 Nov 2021 20:41:45 -0500 Subject: [PATCH] tentative fix for issue #117 --- parallel_hashmap/phmap.h | 39 ++++++++++++++++++----------------- parallel_hashmap/phmap_dump.h | 2 +- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/parallel_hashmap/phmap.h b/parallel_hashmap/phmap.h index 714f571..2736290 100644 --- a/parallel_hashmap/phmap.h +++ b/parallel_hashmap/phmap.h @@ -981,9 +981,10 @@ public: const allocator_type& alloc = allocator_type()) : ctrl_(EmptyGroup()), settings_(0, hashfn, eq, alloc) { if (bucket_cnt) { - capacity_ = NormalizeCapacity(bucket_cnt); - reset_growth_left(); - initialize_slots(); + size_t new_capacity = NormalizeCapacity(bucket_cnt); + reset_growth_left(new_capacity); + initialize_slots(new_capacity); + capacity_ = new_capacity; } } @@ -1202,8 +1203,8 @@ public: } } size_ = 0; - reset_ctrl(); - reset_growth_left(); + reset_ctrl(capacity_); + reset_growth_left(capacity_); } assert(empty()); infoz_.RecordStorageChanged(0, capacity_); @@ -1882,21 +1883,21 @@ private: infoz_.RecordErase(); } - void initialize_slots() { - assert(capacity_); + void initialize_slots(size_t new_capacity) { + assert(new_capacity); if (std::is_same>::value && slots_ == nullptr) { infoz_ = Sample(); } - auto layout = MakeLayout(capacity_); + auto layout = MakeLayout(new_capacity); char* mem = static_cast( Allocate(&alloc_ref(), layout.AllocSize())); ctrl_ = reinterpret_cast(layout.template Pointer<0>(mem)); slots_ = layout.template Pointer<1>(mem); - reset_ctrl(); - reset_growth_left(); - infoz_.RecordStorageChanged(size_, capacity_); + reset_ctrl(new_capacity); + reset_growth_left(new_capacity); + infoz_.RecordStorageChanged(size_, new_capacity); } void destroy_slots() { @@ -1922,8 +1923,8 @@ private: auto* old_ctrl = ctrl_; auto* old_slots = slots_; const size_t old_capacity = capacity_; + initialize_slots(new_capacity); capacity_ = new_capacity; - initialize_slots(); for (size_t i = 0; i != old_capacity; ++i) { if (IsFull(old_ctrl[i])) { @@ -2004,7 +2005,7 @@ private: --i; // repeat } } - reset_growth_left(); + reset_growth_left(capacity_); } void rehash_and_grow_if_necessary() { @@ -2145,14 +2146,14 @@ private: } // Reset all ctrl bytes back to kEmpty, except the sentinel. - void reset_ctrl() { - std::memset(ctrl_, kEmpty, capacity_ + Group::kWidth); - ctrl_[capacity_] = kSentinel; - SanitizerPoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_); + void reset_ctrl(size_t capacity) { + std::memset(ctrl_, kEmpty, capacity + Group::kWidth); + ctrl_[capacity] = kSentinel; + SanitizerPoisonMemoryRegion(slots_, sizeof(slot_type) * capacity); } - void reset_growth_left() { - growth_left() = CapacityToGrowth(capacity()) - size_; + void reset_growth_left(size_t capacity) { + growth_left() = CapacityToGrowth(capacity) - size_; } // Sets the control byte, and if `i < Group::kWidth`, set the cloned byte at diff --git a/parallel_hashmap/phmap_dump.h b/parallel_hashmap/phmap_dump.h index c5f3817..38af55c 100644 --- a/parallel_hashmap/phmap_dump.h +++ b/parallel_hashmap/phmap_dump.h @@ -97,7 +97,7 @@ bool raw_hash_set::load(InputArchive& ar) { } // allocate memory for ctrl_ and slots_ - initialize_slots(); + initialize_slots(capacity_); if (!ar.load(reinterpret_cast(ctrl_), sizeof(ctrl_t) * (capacity_ + Group::kWidth + 1))) { std::cerr << "Failed to load ctrl" << std::endl;