MemoryPool: store usage and capacity as integers instead of using pointers

This commit is contained in:
Benoit Blanchon
2023-06-14 21:05:42 +02:00
parent 437307a955
commit 2a663db3c7

View File

@ -34,11 +34,12 @@ class MemoryPool {
deallocAllStrings();
deallocPool();
allocator_ = src.allocator_;
begin_ = src.begin_;
end_ = src.end_;
right_ = src.right_;
pool_ = src.pool_;
poolCapacity_ = src.poolCapacity_;
poolUsage_ = src.poolUsage_;
overflowed_ = src.overflowed_;
src.begin_ = src.end_ = src.right_ = nullptr;
src.pool_ = nullptr;
src.poolCapacity_ = src.poolUsage_ = 0;
strings_ = src.strings_;
src.strings_ = nullptr;
return *this;
@ -52,17 +53,17 @@ class MemoryPool {
size_t capa = addPadding(requiredSize);
if (capa == capacity())
return;
allocator_->deallocate(begin_);
allocator_->deallocate(pool_);
allocPool(requiredSize);
}
// Gets the capacity of the memoryPool in bytes
size_t capacity() const {
return size_t(end_ - begin_);
return poolCapacity_;
}
size_t size() const {
size_t total = size_t(right_ - begin_);
size_t total = poolUsage_;
for (auto node = strings_; node; node = node->next)
total += sizeofString(node->length);
return total;
@ -77,8 +78,8 @@ class MemoryPool {
overflowed_ = true;
return 0;
}
auto p = right_;
right_ += bytes;
auto p = pool_ + poolUsage_;
poolUsage_ += bytes;
return p;
}
@ -167,13 +168,13 @@ class MemoryPool {
}
void clear() {
right_ = begin_;
poolUsage_ = 0;
overflowed_ = false;
deallocAllStrings();
}
bool canAlloc(size_t bytes) const {
return right_ + bytes <= end_;
return poolUsage_ + bytes <= poolCapacity_;
}
// Workaround for missing placement new
@ -182,14 +183,10 @@ class MemoryPool {
}
ptrdiff_t shrinkToFit() {
auto oldBegin = begin_;
auto newCapacity = size_t(right_ - begin_);
begin_ =
reinterpret_cast<char*>(allocator_->reallocate(begin_, newCapacity));
end_ = right_ = begin_ + newCapacity;
return begin_ - oldBegin;
auto originalPoolAddress = pool_;
pool_ = reinterpret_cast<char*>(allocator_->reallocate(pool_, poolUsage_));
poolCapacity_ = poolUsage_;
return pool_ - originalPoolAddress;
}
private:
@ -202,21 +199,20 @@ class MemoryPool {
}
void allocPool(size_t capa) {
auto buf = capa ? reinterpret_cast<char*>(allocator_->allocate(capa)) : 0;
begin_ = right_ = buf;
end_ = buf ? buf + capa : 0;
ARDUINOJSON_ASSERT(isAligned(begin_));
ARDUINOJSON_ASSERT(isAligned(right_));
ARDUINOJSON_ASSERT(isAligned(end_));
pool_ = capa ? reinterpret_cast<char*>(allocator_->allocate(capa)) : 0;
poolUsage_ = 0;
poolCapacity_ = pool_ ? capa : 0;
ARDUINOJSON_ASSERT(isAligned(pool_));
}
void deallocPool() {
if (begin_)
allocator_->deallocate(begin_);
if (pool_)
allocator_->deallocate(pool_);
}
Allocator* allocator_;
char *begin_, *right_, *end_;
char* pool_;
size_t poolUsage_, poolCapacity_;
bool overflowed_;
StringNode* strings_ = nullptr;
};