From c809962c1825311982617c45c981448b4929f5c7 Mon Sep 17 00:00:00 2001 From: lhc Date: Sat, 9 Aug 2025 20:35:35 +0800 Subject: [PATCH] Synchronous difference code Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICS70N Signed-off-by: lhc Change-Id: I29e1d76cb15cc4c386c823778edbcd0e22a679e9 --- ecmascript/mem/free_object_list.cpp | 69 +++++++++++++++----- ecmascript/mem/free_object_list.h | 6 +- ecmascript/tests/concurrent_marking_test.cpp | 5 -- 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/ecmascript/mem/free_object_list.cpp b/ecmascript/mem/free_object_list.cpp index d2451c6b70..85c33a4cc5 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 ed26c9104c..3f9f75e390 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 d82cc99d5d..8cdb2f2a99 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 -- Gitee