From d45a28a25852e71ac1eb3c5990ec0ea1a3e2b56c Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 17 May 2020 18:54:59 -0700 Subject: [PATCH] ArrayTable save prev table when growing --- include/sta/ArrayTable.hh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/include/sta/ArrayTable.hh b/include/sta/ArrayTable.hh index 1ef5f70d..13aac268 100644 --- a/include/sta/ArrayTable.hh +++ b/include/sta/ArrayTable.hh @@ -59,6 +59,7 @@ private: size_t blocks_size_; size_t blocks_capacity_; ArrayBlock* *blocks_; + ArrayBlock* *prev_blocks_; static constexpr ObjectId idx_mask_ = block_size - 1; }; @@ -68,6 +69,7 @@ ArrayTable::ArrayTable() : blocks_size_(0), blocks_capacity_(1024), blocks_(new ArrayBlock*[blocks_capacity_]), + prev_blocks_(nullptr), free_block_idx_(block_idx_null), free_idx_(object_idx_null) { @@ -78,6 +80,7 @@ ArrayTable::~ArrayTable() { deleteBlocks(); delete [] blocks_; + delete [] prev_blocks_; } template @@ -130,10 +133,12 @@ ArrayTable::pushBlock(ArrayBlock *block) size_t new_capacity = blocks_capacity_ * 1.5; ArrayBlock** new_blocks = new ArrayBlock*[new_capacity]; memcpy(new_blocks, blocks_, blocks_capacity_ * sizeof(ArrayBlock*)); - ArrayBlock** old_blocks = blocks_; + if (prev_blocks_) + delete [] prev_blocks_; + // Preserve block array for other threads to reference. + prev_blocks_ = blocks_; blocks_ = new_blocks; blocks_capacity_ = new_capacity; - delete [] old_blocks; } }