diff --git a/ecmascript/mem/free_object_list.cpp b/ecmascript/mem/free_object_list.cpp index d2451c6b706b59a58764a5a7cb002bfa29dc71d8..85c33a4cc5b645272fa6d437f12004f424f7584c 100644 --- a/ecmascript/mem/free_object_list.cpp +++ b/ecmascript/mem/free_object_list.cpp @@ -14,14 +14,28 @@ */ #include "ecmascript/mem/free_object_list.h" - #include "ecmascript/free_object.h" #include "ecmascript/mem/jit_fort.h" namespace panda::ecmascript { template -FreeObjectList::FreeObjectList(JitFort * fort) : sets_(new FreeObjectSet *[NUMBER_OF_SETS](), NUMBER_OF_SETS), - lastSets_(new FreeObjectSet *[NUMBER_OF_SETS](), NUMBER_OF_SETS), jitFort_(fort) +FreeObjectList::FreeObjectList() : sets_(new FreeObjectSet *[NUMBER_OF_SETS](), NUMBER_OF_SETS), + lastSets_(new FreeObjectSet *[NUMBER_OF_SETS](), NUMBER_OF_SETS) +{ + for (int i = 0; i < NUMBER_OF_SETS; i++) { + sets_[i] = nullptr; + lastSets_[i] = nullptr; + } + noneEmptySetBitMap_ = 0; +} +template FreeObjectList::FreeObjectList(); +template FreeObjectList::FreeObjectList(); + +template <> +FreeObjectList::FreeObjectList(JitFort *fort) + : sets_(new FreeObjectSet *[NUMBER_OF_SETS](), NUMBER_OF_SETS), + lastSets_(new FreeObjectSet *[NUMBER_OF_SETS](), NUMBER_OF_SETS), + jitFort_(fort) { for (int i = 0; i < NUMBER_OF_SETS; i++) { sets_[i] = nullptr; @@ -29,8 +43,6 @@ FreeObjectList::FreeObjectList(JitFort * fort) : sets_(new FreeObjectSet * } noneEmptySetBitMap_ = 0; } -template FreeObjectList::FreeObjectList(JitFort* fort); -template FreeObjectList::FreeObjectList(JitFort* fort); template FreeObjectList::~FreeObjectList() @@ -125,25 +137,25 @@ T *FreeObjectList::LookupSuitableFreeObject(size_t size) template FreeObject *FreeObjectList::LookupSuitableFreeObject(size_t); template -template -void FreeObjectList::FreeImpl(U* region, uintptr_t start, size_t size, bool isAdd) +void FreeObjectList::Free(uintptr_t start, size_t size, bool isAdd) { if (UNLIKELY(start == 0)) { // LCOV_EXCL_BR_LINE return; } if (UNLIKELY(size < MIN_SIZE)) { // LCOV_EXCL_BR_LINE + Region *region = Region::ObjectAddressToRange(reinterpret_cast(start)); region->IncreaseWasted(size); if (isAdd) { wasted_ += size; } return; } - SetType type = SelectSetType(size); if (type == FreeObjectSet::INVALID_SET_TYPE) { return; } + Region *region = Region::ObjectAddressToRange(reinterpret_cast(start)); auto set = region->GetFreeObjectSet(type); if (set == nullptr) { // LCOV_EXCL_BR_LINE LOG_FULL(FATAL) << "The set of region is nullptr"; @@ -159,15 +171,6 @@ void FreeObjectList::FreeImpl(U* region, uintptr_t start, size_t size, bool i } } } -template void FreeObjectList::FreeImpl(Region* region, uintptr_t start, size_t size, bool isAdd); -template void FreeObjectList::FreeImpl(JitFortRegion* region, - uintptr_t start, size_t size, bool isAdd); - -template -void FreeObjectList::Free(uintptr_t start, size_t size, bool isAdd) -{ - return FreeImpl(Region::ObjectAddressToRange(reinterpret_cast(start)), start, size, isAdd); -} // template class instance for non JitFort space uses FreeObject and Region. template void FreeObjectList::Free(uintptr_t, size_t, bool); @@ -175,7 +178,37 @@ template void FreeObjectList::Free(uintptr_t, size_t, bool); template <> void FreeObjectList::Free(uintptr_t start, size_t size, bool isAdd) { - return FreeImpl(jitFort_->ObjectAddressToRange(start), start, size, isAdd); + if (UNLIKELY(start == 0)) { + return; + } + if (UNLIKELY(size < MIN_SIZE)) { + JitFortRegion *region = jitFort_->ObjectAddressToRange(start); + region->IncreaseWasted(size); + if (isAdd) { + wasted_ += size; + } + return; + } + SetType type = SelectSetType(size); + if (type == FreeObjectSet::INVALID_SET_TYPE) { + return; + } + + JitFortRegion *region = jitFort_->ObjectAddressToRange(start); + auto set = region->GetFreeObjectSet(type); + if (set == nullptr) { + LOG_FULL(FATAL) << "The set of region is nullptr"; + return; + } + set->Free(start, size); + + if (isAdd) { + if (set->isAdded_ == 0) { + AddSet(set); + } else { + available_ += size; + } + } } template diff --git a/ecmascript/mem/free_object_list.h b/ecmascript/mem/free_object_list.h index ed26c9104ce14c132264d48083678105e1002044..3f9f75e3903a8e656cfac1122d446d08bb02080a 100644 --- a/ecmascript/mem/free_object_list.h +++ b/ecmascript/mem/free_object_list.h @@ -28,7 +28,8 @@ class JitFort; template class FreeObjectList { public: - FreeObjectList(JitFort* fort = nullptr); + FreeObjectList(); + FreeObjectList(JitFort *fort); ~FreeObjectList(); T *Allocate(size_t size); @@ -80,9 +81,6 @@ public: return NUMBER_OF_SETS; } - template - void FreeImpl(U* region, uintptr_t start, size_t size, bool isAdd); - private: static constexpr int NUMBER_OF_SETS = 39; static constexpr size_t MIN_SIZE = 16; diff --git a/ecmascript/tests/concurrent_marking_test.cpp b/ecmascript/tests/concurrent_marking_test.cpp index d82cc99d5d1911478def3c0fe6cc6e08c5e6dcc4..8cdb2f2a99e43f73fb8c97ec7237afd342f6f00d 100644 --- a/ecmascript/tests/concurrent_marking_test.cpp +++ b/ecmascript/tests/concurrent_marking_test.cpp @@ -167,9 +167,4 @@ HWTEST_F_L0(ConcurrentMarkingTest, ConcurrentMarkingWithFreshRegion) heap->GetConcurrentMarker()->HandleMarkingFinished(); } } - -HWTEST_F_L0(ConcurrentMarkingTest, ConcurrentMarkingRequestBySharedSize) -{ - SharedHeap::GetInstance()->TryTriggerLocalConcurrentMarking(); -} } // namespace panda::test