ArrayTable save prev table when growing
This commit is contained in:
parent
4e0a959328
commit
d45a28a258
|
|
@ -59,6 +59,7 @@ private:
|
||||||
size_t blocks_size_;
|
size_t blocks_size_;
|
||||||
size_t blocks_capacity_;
|
size_t blocks_capacity_;
|
||||||
ArrayBlock<TYPE>* *blocks_;
|
ArrayBlock<TYPE>* *blocks_;
|
||||||
|
ArrayBlock<TYPE>* *prev_blocks_;
|
||||||
static constexpr ObjectId idx_mask_ = block_size - 1;
|
static constexpr ObjectId idx_mask_ = block_size - 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -68,6 +69,7 @@ ArrayTable<TYPE>::ArrayTable() :
|
||||||
blocks_size_(0),
|
blocks_size_(0),
|
||||||
blocks_capacity_(1024),
|
blocks_capacity_(1024),
|
||||||
blocks_(new ArrayBlock<TYPE>*[blocks_capacity_]),
|
blocks_(new ArrayBlock<TYPE>*[blocks_capacity_]),
|
||||||
|
prev_blocks_(nullptr),
|
||||||
free_block_idx_(block_idx_null),
|
free_block_idx_(block_idx_null),
|
||||||
free_idx_(object_idx_null)
|
free_idx_(object_idx_null)
|
||||||
{
|
{
|
||||||
|
|
@ -78,6 +80,7 @@ ArrayTable<TYPE>::~ArrayTable()
|
||||||
{
|
{
|
||||||
deleteBlocks();
|
deleteBlocks();
|
||||||
delete [] blocks_;
|
delete [] blocks_;
|
||||||
|
delete [] prev_blocks_;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class TYPE>
|
template <class TYPE>
|
||||||
|
|
@ -130,10 +133,12 @@ ArrayTable<TYPE>::pushBlock(ArrayBlock<TYPE> *block)
|
||||||
size_t new_capacity = blocks_capacity_ * 1.5;
|
size_t new_capacity = blocks_capacity_ * 1.5;
|
||||||
ArrayBlock<TYPE>** new_blocks = new ArrayBlock<TYPE>*[new_capacity];
|
ArrayBlock<TYPE>** new_blocks = new ArrayBlock<TYPE>*[new_capacity];
|
||||||
memcpy(new_blocks, blocks_, blocks_capacity_ * sizeof(ArrayBlock<TYPE>*));
|
memcpy(new_blocks, blocks_, blocks_capacity_ * sizeof(ArrayBlock<TYPE>*));
|
||||||
ArrayBlock<TYPE>** old_blocks = blocks_;
|
if (prev_blocks_)
|
||||||
|
delete [] prev_blocks_;
|
||||||
|
// Preserve block array for other threads to reference.
|
||||||
|
prev_blocks_ = blocks_;
|
||||||
blocks_ = new_blocks;
|
blocks_ = new_blocks;
|
||||||
blocks_capacity_ = new_capacity;
|
blocks_capacity_ = new_capacity;
|
||||||
delete [] old_blocks;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue