8222986: Add parameter to skip clearing CHeapBitMaps when resizing

Reviewed-by: pliden
This commit is contained in:
Stefan Karlsson 2019-05-02 10:32:14 +02:00
parent 087c03a0c7
commit 13cd1ce5af
2 changed files with 23 additions and 23 deletions

View File

@ -111,26 +111,26 @@ void BitMap::free(const Allocator& allocator, bm_word_t* map, idx_t size_in_bit
} }
template <class Allocator> template <class Allocator>
void BitMap::resize(const Allocator& allocator, idx_t new_size_in_bits) { void BitMap::resize(const Allocator& allocator, idx_t new_size_in_bits, bool clear) {
bm_word_t* new_map = reallocate(allocator, map(), size(), new_size_in_bits); bm_word_t* new_map = reallocate(allocator, map(), size(), new_size_in_bits, clear);
update(new_map, new_size_in_bits); update(new_map, new_size_in_bits);
} }
template <class Allocator> template <class Allocator>
void BitMap::initialize(const Allocator& allocator, idx_t size_in_bits) { void BitMap::initialize(const Allocator& allocator, idx_t size_in_bits, bool clear) {
assert(map() == NULL, "precondition"); assert(map() == NULL, "precondition");
assert(size() == 0, "precondition"); assert(size() == 0, "precondition");
resize(allocator, size_in_bits); resize(allocator, size_in_bits, clear);
} }
template <class Allocator> template <class Allocator>
void BitMap::reinitialize(const Allocator& allocator, idx_t new_size_in_bits) { void BitMap::reinitialize(const Allocator& allocator, idx_t new_size_in_bits, bool clear) {
// Remove previous bits. // Remove previous bits - no need to clear
resize(allocator, 0); resize(allocator, 0, false /* clear */);
initialize(allocator, new_size_in_bits); initialize(allocator, new_size_in_bits, clear);
} }
ResourceBitMap::ResourceBitMap(idx_t size_in_bits) ResourceBitMap::ResourceBitMap(idx_t size_in_bits)
@ -138,15 +138,15 @@ ResourceBitMap::ResourceBitMap(idx_t size_in_bits)
} }
void ResourceBitMap::resize(idx_t new_size_in_bits) { void ResourceBitMap::resize(idx_t new_size_in_bits) {
BitMap::resize(ResourceBitMapAllocator(), new_size_in_bits); BitMap::resize(ResourceBitMapAllocator(), new_size_in_bits, true /* clear */);
} }
void ResourceBitMap::initialize(idx_t size_in_bits) { void ResourceBitMap::initialize(idx_t size_in_bits) {
BitMap::initialize(ResourceBitMapAllocator(), size_in_bits); BitMap::initialize(ResourceBitMapAllocator(), size_in_bits, true /* clear */);
} }
void ResourceBitMap::reinitialize(idx_t size_in_bits) { void ResourceBitMap::reinitialize(idx_t size_in_bits) {
BitMap::reinitialize(ResourceBitMapAllocator(), size_in_bits); BitMap::reinitialize(ResourceBitMapAllocator(), size_in_bits, true /* clear */);
} }
ArenaBitMap::ArenaBitMap(Arena* arena, idx_t size_in_bits) ArenaBitMap::ArenaBitMap(Arena* arena, idx_t size_in_bits)
@ -161,16 +161,16 @@ CHeapBitMap::~CHeapBitMap() {
free(CHeapBitMapAllocator(_flags), map(), size()); free(CHeapBitMapAllocator(_flags), map(), size());
} }
void CHeapBitMap::resize(idx_t new_size_in_bits) { void CHeapBitMap::resize(idx_t new_size_in_bits, bool clear) {
BitMap::resize(CHeapBitMapAllocator(_flags), new_size_in_bits); BitMap::resize(CHeapBitMapAllocator(_flags), new_size_in_bits, clear);
} }
void CHeapBitMap::initialize(idx_t size_in_bits) { void CHeapBitMap::initialize(idx_t size_in_bits, bool clear) {
BitMap::initialize(CHeapBitMapAllocator(_flags), size_in_bits); BitMap::initialize(CHeapBitMapAllocator(_flags), size_in_bits, clear);
} }
void CHeapBitMap::reinitialize(idx_t size_in_bits) { void CHeapBitMap::reinitialize(idx_t size_in_bits, bool clear) {
BitMap::reinitialize(CHeapBitMapAllocator(_flags), size_in_bits); BitMap::reinitialize(CHeapBitMapAllocator(_flags), size_in_bits, clear);
} }
#ifdef ASSERT #ifdef ASSERT

View File

@ -157,20 +157,20 @@ class BitMap {
// Old bits are transfered to the new memory // Old bits are transfered to the new memory
// and the extended memory is cleared. // and the extended memory is cleared.
template <class Allocator> template <class Allocator>
void resize(const Allocator& allocator, idx_t new_size_in_bits); void resize(const Allocator& allocator, idx_t new_size_in_bits, bool clear);
// Set up and clear the bitmap memory. // Set up and clear the bitmap memory.
// //
// Precondition: The bitmap was default constructed and has // Precondition: The bitmap was default constructed and has
// not yet had memory allocated via resize or (re)initialize. // not yet had memory allocated via resize or (re)initialize.
template <class Allocator> template <class Allocator>
void initialize(const Allocator& allocator, idx_t size_in_bits); void initialize(const Allocator& allocator, idx_t size_in_bits, bool clear);
// Set up and clear the bitmap memory. // Set up and clear the bitmap memory.
// //
// Can be called on previously initialized bitmaps. // Can be called on previously initialized bitmaps.
template <class Allocator> template <class Allocator>
void reinitialize(const Allocator& allocator, idx_t new_size_in_bits); void reinitialize(const Allocator& allocator, idx_t new_size_in_bits, bool clear);
// Set the map and size. // Set the map and size.
void update(bm_word_t* map, idx_t size) { void update(bm_word_t* map, idx_t size) {
@ -384,18 +384,18 @@ class CHeapBitMap : public BitMap {
// //
// Old bits are transfered to the new memory // Old bits are transfered to the new memory
// and the extended memory is cleared. // and the extended memory is cleared.
void resize(idx_t new_size_in_bits); void resize(idx_t new_size_in_bits, bool clear = true);
// Set up and clear the bitmap memory. // Set up and clear the bitmap memory.
// //
// Precondition: The bitmap was default constructed and has // Precondition: The bitmap was default constructed and has
// not yet had memory allocated via resize or initialize. // not yet had memory allocated via resize or initialize.
void initialize(idx_t size_in_bits); void initialize(idx_t size_in_bits, bool clear = true);
// Set up and clear the bitmap memory. // Set up and clear the bitmap memory.
// //
// Can be called on previously initialized bitmaps. // Can be called on previously initialized bitmaps.
void reinitialize(idx_t size_in_bits); void reinitialize(idx_t size_in_bits, bool clear = true);
}; };
// Convenience class wrapping BitMap which provides multiple bits per slot. // Convenience class wrapping BitMap which provides multiple bits per slot.