mirror of
https://github.com/greg7mdp/parallel-hashmap.git
synced 2026-08-29 16:40:39 +08:00
tentative fix for issue #117
This commit is contained in:
Vendored
+20
-19
@@ -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<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() {
|
||||
@@ -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
|
||||
|
||||
Vendored
+1
-1
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user