mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2025-02-17 10:18:13 +00:00
!9934 Optimize freelist allocation
Merge pull request !9934 from lukai/freelistOpt
This commit is contained in:
commit
57cb23b7c7
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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};
|
||||
|
Loading…
x
Reference in New Issue
Block a user