Skip to content

Commit

Permalink
tentative fix for issue #117
Browse files Browse the repository at this point in the history
  • Loading branch information
greg7mdp committed Nov 19, 2021
1 parent 07b740b commit b0ac9ef
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 20 deletions.
39 changes: 20 additions & 19 deletions parallel_hashmap/phmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -981,9 +981,10 @@ class raw_hash_set
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;
}
}

Expand Down Expand Up @@ -1202,8 +1203,8 @@ class raw_hash_set
}
}
size_ = 0;
reset_ctrl();
reset_growth_left();
reset_ctrl(capacity_);
reset_growth_left(capacity_);
}
assert(empty());
infoz_.RecordStorageChanged(0, capacity_);
Expand Down Expand Up @@ -1882,21 +1883,21 @@ class raw_hash_set
infoz_.RecordErase();
}

void initialize_slots() {
assert(capacity_);
void initialize_slots(size_t new_capacity) {
assert(new_capacity);
if (std::is_same<SlotAlloc, std::allocator<slot_type>>::value &&
slots_ == nullptr) {
infoz_ = Sample();
}

auto layout = MakeLayout(capacity_);
auto layout = MakeLayout(new_capacity);
char* mem = static_cast<char*>(
Allocate<Layout::Alignment()>(&alloc_ref(), layout.AllocSize()));
ctrl_ = reinterpret_cast<ctrl_t*>(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() {
Expand All @@ -1922,8 +1923,8 @@ class raw_hash_set
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])) {
Expand Down Expand Up @@ -2004,7 +2005,7 @@ class raw_hash_set
--i; // repeat
}
}
reset_growth_left();
reset_growth_left(capacity_);
}

void rehash_and_grow_if_necessary() {
Expand Down Expand Up @@ -2145,14 +2146,14 @@ class raw_hash_set
}

// 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
Expand Down
2 changes: 1 addition & 1 deletion parallel_hashmap/phmap_dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ bool raw_hash_set<Policy, Hash, Eq, Alloc>::load(InputArchive& ar) {
}

// allocate memory for ctrl_ and slots_
initialize_slots();
initialize_slots(capacity_);
if (!ar.load(reinterpret_cast<char*>(ctrl_),
sizeof(ctrl_t) * (capacity_ + Group::kWidth + 1))) {
std::cerr << "Failed to load ctrl" << std::endl;
Expand Down

0 comments on commit b0ac9ef

Please sign in to comment.