!9934 Optimize freelist allocation

Merge pull request !9934 from lukai/freelistOpt
This commit is contained in:
openharmony_ci 2024-10-26 18:26:32 +00:00 committed by Gitee
commit 57cb23b7c7
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 13 additions and 1 deletions

View File

@ -60,7 +60,7 @@ T *FreeObjectList<T>::Allocate(size_t size)
lastType = type;
FreeObjectSet<T> *current = sets_[type];
while (current != nullptr) {
if (current->Available() < size) {
if (current->Available() < size || size > current->MaxAvailableFreeSize()) {
current = current->next_;
continue;
}

View File

@ -26,6 +26,7 @@ void FreeObjectSet<T>::Free(uintptr_t begin, size_t size)
freeObject->SetNext(freeObject_);
freeObject_ = freeObject;
available_ += size;
maxAvailableFreeSize_ = std::max(maxAvailableFreeSize_, size);
}
template void FreeObjectSet<FreeObject>::Free(uintptr_t, size_t);
@ -42,6 +43,7 @@ void FreeObjectSet<MemDesc>::Free(uintptr_t begin, size_t size)
freeObject->SetNext(freeObject_);
freeObject_ = freeObject;
available_ += size;
maxAvailableFreeSize_ = std::max(maxAvailableFreeSize_, size);
}
template <typename T>
@ -49,6 +51,7 @@ void FreeObjectSet<T>::Rebuild()
{
freeObject_ = T::Cast(INVALID_OBJPTR);
available_ = 0;
maxAvailableFreeSize_ = 0;
isAdded_ = 0;
next_ = nullptr;
prev_ = nullptr;
@ -67,6 +70,7 @@ void FreeObjectSet<MemDesc>::Rebuild()
}
freeObject_ = MemDesc::Cast(INVALID_OBJPTR);
available_ = 0;
maxAvailableFreeSize_ = 0;
isAdded_ = 0;
next_ = nullptr;
prev_ = nullptr;
@ -120,6 +124,8 @@ T *FreeObjectSet<T>::ObtainLargeFreeObject(size_t size)
prevFreeObject = curFreeObject;
curFreeObject = curFreeObject->GetNext();
}
// When looking up suitable freeobject fails, available free size should update to a value less than size.
maxAvailableFreeSize_ = std::min(maxAvailableFreeSize_, size - sizeof(JSTaggedType));
return T::Cast(INVALID_OBJPTR);
}

View File

@ -52,6 +52,11 @@ public:
return available_;
}
inline size_t MaxAvailableFreeSize() const
{
return maxAvailableFreeSize_;
}
void Free(uintptr_t begin, size_t size);
void Rebuild();
@ -71,6 +76,7 @@ private:
FreeObjectSet *prev_ = nullptr;
SetType setType_ = INVALID_SET_TYPE;
size_t available_ = 0;
size_t maxAvailableFreeSize_ = 0;
uint64_t isAdded_ = 0; // 0: not added, 1: is added
T *freeObject_ = nullptr;
MemDescPool *memDescPool_ {nullptr};