From e00a0fb6006294654a216d878812b5d0fa16fb43 Mon Sep 17 00:00:00 2001 From: xiongluo Date: Thu, 4 Sep 2025 16:25:38 +0800 Subject: [PATCH] Fix duplicate cmc gc request Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICWDZJ?from=project-issue Signed-off-by: xiongluo Change-Id: Iad077fe7cc2ddb7ca296c89913a7dd2174d01664 --- .../tests/base_runtime_test.cpp | 8 ++--- .../heap/allocator/regional_heap.h | 2 +- .../heap/ark_collector/ark_collector.cpp | 30 +++++++++---------- .../heap/ark_collector/copy_barrier.cpp | 2 +- .../heap/ark_collector/enum_barrier.cpp | 2 +- .../heap/ark_collector/marking_barrier.cpp | 2 +- .../ark_collector/post_marking_barrier.cpp | 4 +-- .../heap/ark_collector/preforward_barrier.cpp | 3 +- .../heap/ark_collector/remark_barrier.cpp | 2 +- .../tests/ark_collector_test.cpp | 14 ++++----- .../ark_collector/tests/copy_barrier_test.cpp | 2 +- .../ark_collector/tests/enum_barrier_test.cpp | 2 +- .../tests/marking_barrier_test.cpp | 2 +- .../tests/post_marking_barrier_test.cpp | 4 +-- .../tests/preforward_barrier_test.cpp | 2 +- .../tests/remark_barrier_test.cpp | 2 +- .../heap/collector/collector_proxy.cpp | 11 ++----- .../heap/collector/collector_resources.cpp | 19 ++++++++++-- .../heap/collector/collector_resources.h | 9 ++++++ common_components/heap/collector/gc_stats.h | 2 +- .../heap/collector/marking_collector.cpp | 8 ++--- .../heap/collector/marking_collector.h | 7 ++++- .../heap/collector/task_queue.cpp | 6 ++++ .../collector/tests/collector_proxy_test.cpp | 9 +++--- .../tests/marking_collector_test.cpp | 20 ++++++------- common_components/heap/heap.cpp | 6 ++-- common_components/heap/heap.h | 4 +-- common_components/heap/space/appspawn_space.h | 2 +- common_components/heap/space/large_space.cpp | 2 +- .../heap/space/nonmovable_space.cpp | 2 +- common_components/heap/space/old_space.h | 2 +- .../heap/space/rawpointer_space.h | 2 +- .../heap/tests/heap_manager_test.cpp | 5 ++-- .../heap/tests/verification_test.cpp | 8 ++--- common_components/heap/verification.cpp | 2 +- common_components/mutator/satb_buffer.cpp | 2 +- .../mutator/tests/satb_buffer_test.cpp | 12 ++++---- ecmascript/compiler/stub_builder.cpp | 26 ++++++++-------- ecmascript/compiler/stub_builder.h | 4 +-- ecmascript/js_thread.h | 12 ++++---- ecmascript/mem/barriers.cpp | 4 +-- ecmascript/mem/barriers.h | 2 +- ecmascript/mem/cmc_gc/hooks.cpp | 4 +-- 43 files changed, 153 insertions(+), 122 deletions(-) diff --git a/common_components/common_runtime/tests/base_runtime_test.cpp b/common_components/common_runtime/tests/base_runtime_test.cpp index 033020630b..b02e5d4080 100644 --- a/common_components/common_runtime/tests/base_runtime_test.cpp +++ b/common_components/common_runtime/tests/base_runtime_test.cpp @@ -99,10 +99,10 @@ HWTEST_F_L0(BaseRuntimeTest, RequestGC_Sync_CallsHeapManager) { }; const std::vector testCases = { - {GC_REASON_USER, false, GC_TYPE_FULL}, - {GC_REASON_USER, true, GC_TYPE_FULL}, - {GC_REASON_BACKUP, false, GC_TYPE_FULL}, - {GC_REASON_APPSPAWN, false, GC_TYPE_FULL} + {GCReason::GC_REASON_USER, false, GCType::GC_TYPE_FULL}, + {GCReason::GC_REASON_USER, true, GCType::GC_TYPE_FULL}, + {GCReason::GC_REASON_BACKUP, false, GCType::GC_TYPE_FULL}, + {GCReason::GC_REASON_APPSPAWN, false, GCType::GC_TYPE_FULL} }; for (TestCase tc : testCases) { diff --git a/common_components/heap/allocator/regional_heap.h b/common_components/heap/allocator/regional_heap.h index 2bc0cc98d5..2baa94c627 100755 --- a/common_components/heap/allocator/regional_heap.h +++ b/common_components/heap/allocator/regional_heap.h @@ -283,7 +283,7 @@ public: { youngSpace_.AssembleGarbageCandidates(fromSpace_); oldSpace_.AssembleRecentFull(); - if (Heap::GetHeap().GetGCReason() != GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() != GC_TYPE_YOUNG) { oldSpace_.ClearRSet(); oldSpace_.AssembleGarbageCandidates(fromSpace_); nonMovableSpace_.ClearRSet(); diff --git a/common_components/heap/ark_collector/ark_collector.cpp b/common_components/heap/ark_collector/ark_collector.cpp index 019834557f..7fdf8d002e 100755 --- a/common_components/heap/ark_collector/ark_collector.cpp +++ b/common_components/heap/ark_collector/ark_collector.cpp @@ -144,7 +144,7 @@ static void MarkingRefField(BaseObject *obj, BaseObject *targetObj, RefField<> & WorkStack &workStack, RegionDesc *targetRegion); // note each ref-field will not be marked twice, so each old pointer the markingr meets must come from previous gc. static void MarkingRefField(BaseObject *obj, RefField<> &field, WorkStack &workStack, - WeakStack &weakStack, const GCReason gcReason) + WeakStack &weakStack, const GCType gcType) { RefField<> oldField(field); BaseObject* targetObj = oldField.GetTargetObject(); @@ -156,7 +156,7 @@ static void MarkingRefField(BaseObject *obj, RefField<> &field, WorkStack &workS DCHECK_CC(Heap::IsHeapAddress(targetObj)); auto targetRegion = RegionDesc::GetAliveRegionDescAt(reinterpret_cast((void*)targetObj)); - if (gcReason != GC_REASON_YOUNG && oldField.IsWeak()) { + if (gcType != GC_TYPE_YOUNG && oldField.IsWeak()) { DLOG(TRACE, "marking: skip weak obj when full gc, object: %p@%p, targetObj: %p", obj, &field, targetObj); // weak ref is cleared after roots pre-forward, so there might be a to-version weak ref which also need to be // cleared, offset recorded here will help us find it @@ -166,7 +166,7 @@ static void MarkingRefField(BaseObject *obj, RefField<> &field, WorkStack &workS } // cannot skip objects in EXEMPTED_FROM_REGION, because its rset is incomplete - if (gcReason == GC_REASON_YOUNG && !targetRegion->IsInYoungSpace()) { + if (gcType == GC_TYPE_YOUNG && !targetRegion->IsInYoungSpace()) { DLOG(TRACE, "marking: skip non-young object %p@%p, target object: %p<%p>(%zu)", obj, &field, targetObj, targetObj->GetTypeInfo(), targetObj->GetSize()); return; @@ -198,15 +198,15 @@ MarkingCollector::MarkingRefFieldVisitor ArkCollector::CreateMarkingObjectRefFie { MarkingRefFieldVisitor visitor; - if (gcReason_ == GCReason::GC_REASON_YOUNG) { + if (IsYoungGC()) { visitor.SetVisitor([obj = visitor.GetClosure(), workStack, weakStack](RefField<> &field) { - const GCReason gcReason = GCReason::GC_REASON_YOUNG; - MarkingRefField(*obj, field, *workStack, *weakStack, gcReason); + const GCType gcType = GCType::GC_TYPE_YOUNG; + MarkingRefField(*obj, field, *workStack, *weakStack, gcType); }); } else { visitor.SetVisitor([obj = visitor.GetClosure(), workStack, weakStack](RefField<> &field) { - const GCReason gcReason = GCReason::GC_REASON_HEU; - MarkingRefField(*obj, field, *workStack, *weakStack, gcReason); + const GCType gcType = GCType::GC_TYPE_FULL; + MarkingRefField(*obj, field, *workStack, *weakStack, gcType); }); } return visitor; @@ -320,7 +320,7 @@ public: } MarkToObject(oldObj, toVersion); } else { - if (Heap::GetHeap().GetGCReason() != GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() != GC_TYPE_YOUNG) { MarkObject(oldObj); } else if (RegionalHeap::IsYoungSpaceObject(oldObj) && !RegionalHeap::IsNewObjectSinceMarking(oldObj) && !RegionalHeap::IsMarkedObject(oldObj)) { @@ -566,7 +566,7 @@ WeakRefFieldVisitor ArkCollector::GetWeakRefFieldVisitor() return [this](RefField<> &refField) -> bool { RefField<> oldField(refField); BaseObject *oldObj = oldField.GetTargetObject(); - if (gcReason_ == GC_REASON_YOUNG) { + if (IsYoungGC()) { if (RegionalHeap::IsYoungSpaceObject(oldObj) && !IsMarkedObject(oldObj) && !RegionalHeap::IsNewObjectSinceMarking(oldObj)) { return false; @@ -631,7 +631,7 @@ void ArkCollector::PreforwardFlip() WeakRefFieldVisitor weakVisitor = GetWeakRefFieldVisitor(); SetGCThreadQosPriority(common::PriorityMode::FOREGROUND); - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { // only visit weak roots that may reference young objects VisitDynamicWeakGlobalRoots(weakVisitor); } else { @@ -682,7 +682,7 @@ void ArkCollector::ConcurrentPreforward() void ArkCollector::PrepareFix() { - if (Heap::GetHeap().GetGCReason() == GCReason::GC_REASON_YOUNG) { + if (IsYoungGC()) { // string table objects are always not in young space, skip it return; } @@ -771,7 +771,7 @@ void ArkCollector::FixHeap() void ArkCollector::DoGarbageCollection() { - const bool isNotYoungGC = gcReason_ != GCReason::GC_REASON_YOUNG; + const bool isNotYoungGC = !IsYoungGC(); OHOS_HITRACE(HITRACE_LEVEL_COMMERCIAL, "CMCGC::DoGarbageCollection", ""); if (gcMode_ == GCMode::STW) { // 2: stw-gc #ifdef ENABLE_CMC_RB_DFX @@ -905,7 +905,7 @@ void ArkCollector::ProcessStringTable() #ifdef GC_STW_STRINGTABLE return; #endif - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { // no need to fix weak ref in young gc return; } @@ -913,7 +913,7 @@ void ArkCollector::ProcessStringTable() WeakRefFieldVisitor weakVisitor = [this](RefField<> &refField) -> bool { auto isSurvivor = [this](BaseObject* oldObj) { RegionDesc* region = RegionDesc::GetAliveRegionDescAt(reinterpret_cast(oldObj)); - return (gcReason_ == GC_REASON_YOUNG && !region->IsInYoungSpace()) + return (IsYoungGC() && !region->IsInYoungSpace()) || region->IsMarkedObject(oldObj) || region->IsNewObjectSinceMarking(oldObj) || region->IsToRegion(); diff --git a/common_components/heap/ark_collector/copy_barrier.cpp b/common_components/heap/ark_collector/copy_barrier.cpp index f639f0ba7f..254bc3b962 100755 --- a/common_components/heap/ark_collector/copy_barrier.cpp +++ b/common_components/heap/ark_collector/copy_barrier.cpp @@ -50,7 +50,7 @@ BaseObject* CopyBarrier::ReadStringTableStaticRef(RefField& field) const { // Note: CMC GC assumes all objects in string table are not in young space. Based on the assumption, CMC GC skip // read barrier in young GC - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { return reinterpret_cast(field.GetFieldValue()); } diff --git a/common_components/heap/ark_collector/enum_barrier.cpp b/common_components/heap/ark_collector/enum_barrier.cpp index 45dde4bf47..b917e7ccee 100755 --- a/common_components/heap/ark_collector/enum_barrier.cpp +++ b/common_components/heap/ark_collector/enum_barrier.cpp @@ -90,7 +90,7 @@ void EnumBarrier::WriteBarrier(BaseObject* obj, RefField& field, BaseObje if (!Heap::IsTaggedObject((HeapAddress)ref)) { return; } - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { UpdateRememberSet(obj, ref); } ref = (BaseObject*)((uintptr_t)ref & ~(TAG_WEAK)); diff --git a/common_components/heap/ark_collector/marking_barrier.cpp b/common_components/heap/ark_collector/marking_barrier.cpp index 049349b3be..8e5f4cb606 100755 --- a/common_components/heap/ark_collector/marking_barrier.cpp +++ b/common_components/heap/ark_collector/marking_barrier.cpp @@ -88,7 +88,7 @@ void MarkingBarrier::WriteBarrier(BaseObject* obj, RefField& field, BaseO if (!Heap::IsTaggedObject((HeapAddress)ref)) { return; } - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { UpdateRememberSet(obj, ref); } ref = (BaseObject*)((uintptr_t)ref & ~(TAG_WEAK)); diff --git a/common_components/heap/ark_collector/post_marking_barrier.cpp b/common_components/heap/ark_collector/post_marking_barrier.cpp index 0afa07f836..d9da46a3f5 100755 --- a/common_components/heap/ark_collector/post_marking_barrier.cpp +++ b/common_components/heap/ark_collector/post_marking_barrier.cpp @@ -35,7 +35,7 @@ BaseObject* PostMarkingBarrier::ReadStringTableStaticRef(RefField &field) { // Note: CMC GC assumes all objects in string table are not in young space. Based on the assumption, CMC GC skip // read barrier in young GC - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { return reinterpret_cast(field.GetFieldValue()); } @@ -67,7 +67,7 @@ void PostMarkingBarrier::WriteRefField(BaseObject* obj, RefField& field, void PostMarkingBarrier::WriteBarrier(BaseObject* obj, RefField& field, BaseObject* ref) const { - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { UpdateRememberSet(obj, ref); } } diff --git a/common_components/heap/ark_collector/preforward_barrier.cpp b/common_components/heap/ark_collector/preforward_barrier.cpp index ec6affc5fc..ce80f4b02d 100755 --- a/common_components/heap/ark_collector/preforward_barrier.cpp +++ b/common_components/heap/ark_collector/preforward_barrier.cpp @@ -51,12 +51,11 @@ BaseObject* PreforwardBarrier::ReadStringTableStaticRef(RefField& field) { // Note: CMC GC assumes all objects in string table are not in young space. Based on the assumption, CMC GC skip // read barrier in young GC - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { return reinterpret_cast(field.GetFieldValue()); } auto isSurvivor = [](BaseObject* obj) { - auto gcReason = Heap::GetHeap().GetGCReason(); RegionDesc *regionInfo = RegionDesc::GetAliveRegionDescAt(reinterpret_cast(obj)); return (regionInfo->IsNewObjectSinceMarking(obj) || regionInfo->IsToRegion() || regionInfo->IsMarkedObject(obj)); diff --git a/common_components/heap/ark_collector/remark_barrier.cpp b/common_components/heap/ark_collector/remark_barrier.cpp index 24b19cf7a5..9efbf85b7b 100644 --- a/common_components/heap/ark_collector/remark_barrier.cpp +++ b/common_components/heap/ark_collector/remark_barrier.cpp @@ -36,7 +36,7 @@ BaseObject* RemarkBarrier::ReadStringTableStaticRef(RefField &field) cons { // Note: CMC GC assumes all objects in string table are not in young space. Based on the assumption, CMC GC skip // read barrier in young GC - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { return reinterpret_cast(field.GetFieldValue()); } diff --git a/common_components/heap/ark_collector/tests/ark_collector_test.cpp b/common_components/heap/ark_collector/tests/ark_collector_test.cpp index 6aaef3211e..827b3827bf 100644 --- a/common_components/heap/ark_collector/tests/ark_collector_test.cpp +++ b/common_components/heap/ark_collector/tests/ark_collector_test.cpp @@ -226,7 +226,7 @@ HWTEST_F_L0(ArkCollectorTest, MarkingRefField_TEST1) MarkStack workStack; WeakStack weakStack; - MarkingRefField(nullptr, field, workStack, weakStack, GCReason::GC_REASON_YOUNG); + MarkingRefField(nullptr, field, workStack, weakStack, GCType::GC_TYPE_YOUNG); EXPECT_FALSE(Heap::IsTaggedObject(field.GetFieldValue())); } @@ -240,7 +240,7 @@ HWTEST_F_L0(ArkCollectorTest, MarkingRefField_TEST2) MarkStack workStack; WeakStack weakStack; - MarkingRefField(nullptr, field, workStack, weakStack, GCReason::GC_REASON_APPSPAWN); + MarkingRefField(nullptr, field, workStack, weakStack, GCType::GC_TYPE_FULL); EXPECT_FALSE(region->IsInOldSpace()); workStack.pop_back(); } @@ -255,7 +255,7 @@ HWTEST_F_L0(ArkCollectorTest, MarkingRefField_TEST3) MarkStack workStack; WeakStack weakStack; - MarkingRefField(nullptr, field, workStack, weakStack, GCReason::GC_REASON_APPSPAWN); + MarkingRefField(nullptr, field, workStack, weakStack, GCType::GC_TYPE_FULL); EXPECT_TRUE(region->IsInOldSpace()); workStack.pop_back(); } @@ -270,7 +270,7 @@ HWTEST_F_L0(ArkCollectorTest, MarkingRefField_TEST4) MarkStack workStack; WeakStack weakStack; - MarkingRefField(nullptr, field, workStack, weakStack, GCReason::GC_REASON_YOUNG); + MarkingRefField(nullptr, field, workStack, weakStack, GCType::GC_TYPE_YOUNG); EXPECT_FALSE(region->IsInOldSpace()); workStack.pop_back(); } @@ -285,7 +285,7 @@ HWTEST_F_L0(ArkCollectorTest, MarkingRefField_TEST5) MarkStack workStack; WeakStack weakStack; - MarkingRefField(nullptr, field, workStack, weakStack, GCReason::GC_REASON_YOUNG); + MarkingRefField(nullptr, field, workStack, weakStack, GCType::GC_TYPE_YOUNG); EXPECT_TRUE(region->IsInOldSpace()); } @@ -304,7 +304,7 @@ HWTEST_F_L0(ArkCollectorTest, MarkingRefField_TEST6) } class TestCreateMarkingArkCollector : public MarkingCollector { public: - using MarkingCollector::SetGCReason; + using MarkingCollector::SetGCType; explicit TestCreateMarkingArkCollector(Allocator& allocator, CollectorResources& resources) : MarkingCollector(allocator, resources) {} BaseObject* ForwardObject(BaseObject*) override { return nullptr; } @@ -337,7 +337,7 @@ HWTEST_F_L0(ArkCollectorTest, CreateMarkingObjectRefFieldsVisitor_TEST1) MarkStack workStack; WeakStack weakStack; TestCreateMarkingArkCollector* collector = reinterpret_cast(arkCollector.get()); - collector->SetGCReason(GCReason::GC_REASON_YOUNG); + collector->SetGCType(GCType::GC_TYPE_YOUNG); auto visitor = arkCollector->CreateMarkingObjectRefFieldsVisitor(&workStack, &weakStack); EXPECT_TRUE(visitor.GetRefFieldVisitor() != nullptr); } diff --git a/common_components/heap/ark_collector/tests/copy_barrier_test.cpp b/common_components/heap/ark_collector/tests/copy_barrier_test.cpp index 280fd8758a..4260ea16ac 100755 --- a/common_components/heap/ark_collector/tests/copy_barrier_test.cpp +++ b/common_components/heap/ark_collector/tests/copy_barrier_test.cpp @@ -188,7 +188,7 @@ HWTEST_F_L0(CopyBarrierTest, ReadStringTableStaticRef_TEST4) BaseObject* obj = reinterpret_cast(addr); RefField field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); BaseObject* resultObj = copyBarrier->ReadStringTableStaticRef(field); ASSERT_TRUE(resultObj != nullptr); } diff --git a/common_components/heap/ark_collector/tests/enum_barrier_test.cpp b/common_components/heap/ark_collector/tests/enum_barrier_test.cpp index 31fd6b0195..0ce41b7778 100755 --- a/common_components/heap/ark_collector/tests/enum_barrier_test.cpp +++ b/common_components/heap/ark_collector/tests/enum_barrier_test.cpp @@ -200,7 +200,7 @@ HWTEST_F_L0(EnumBarrierTest, WriteBarrier_TEST3) HeapAddress addr = HeapManager::Allocate(sizeof(BaseObject), AllocType::MOVEABLE_OBJECT, true); BaseObject* obj = reinterpret_cast(addr); RefField<> field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); enumBarrier->WriteBarrier(obj, field, obj); EXPECT_TRUE(obj != nullptr); #endif diff --git a/common_components/heap/ark_collector/tests/marking_barrier_test.cpp b/common_components/heap/ark_collector/tests/marking_barrier_test.cpp index be88b96801..90d35642f3 100755 --- a/common_components/heap/ark_collector/tests/marking_barrier_test.cpp +++ b/common_components/heap/ark_collector/tests/marking_barrier_test.cpp @@ -218,7 +218,7 @@ HWTEST_F_L0(MarkingBarrierTest, WriteBarrier_TEST3) HeapAddress addr = HeapManager::Allocate(sizeof(BaseObject), AllocType::MOVEABLE_OBJECT, true); BaseObject* obj = reinterpret_cast(addr); RefField<> field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); markingBarrier->WriteBarrier(obj, field, obj); EXPECT_TRUE(obj != nullptr); #endif diff --git a/common_components/heap/ark_collector/tests/post_marking_barrier_test.cpp b/common_components/heap/ark_collector/tests/post_marking_barrier_test.cpp index 140515f1eb..6b5923308b 100755 --- a/common_components/heap/ark_collector/tests/post_marking_barrier_test.cpp +++ b/common_components/heap/ark_collector/tests/post_marking_barrier_test.cpp @@ -143,7 +143,7 @@ HWTEST_F_L0(PostMarkingBarrierTest, ReadStringTableStaticRef_TEST4) BaseObject* obj = reinterpret_cast(addr); RefField field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); BaseObject* resultObj = postMarkingBarrier->ReadStringTableStaticRef(field); ASSERT_TRUE(resultObj != nullptr); } @@ -190,7 +190,7 @@ HWTEST_F_L0(PostMarkingBarrierTest, WriteBarrier_TEST2) HeapAddress addr = HeapManager::Allocate(sizeof(BaseObject), AllocType::MOVEABLE_OBJECT, true); BaseObject* obj = reinterpret_cast(addr); RefField<> field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); postMarkingBarrier->WriteBarrier(obj, field, obj); EXPECT_TRUE(obj != nullptr); } diff --git a/common_components/heap/ark_collector/tests/preforward_barrier_test.cpp b/common_components/heap/ark_collector/tests/preforward_barrier_test.cpp index 11851db59c..d80ca61471 100755 --- a/common_components/heap/ark_collector/tests/preforward_barrier_test.cpp +++ b/common_components/heap/ark_collector/tests/preforward_barrier_test.cpp @@ -188,7 +188,7 @@ HWTEST_F_L0(PreforwardBarrierTest, ReadStringTableStaticRef_TEST4) BaseObject* obj = reinterpret_cast(addr); RefField field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); BaseObject* resultObj = preforwardBarrier->ReadStringTableStaticRef(field); ASSERT_TRUE(resultObj != nullptr); } diff --git a/common_components/heap/ark_collector/tests/remark_barrier_test.cpp b/common_components/heap/ark_collector/tests/remark_barrier_test.cpp index 0aaea4d50c..71f879c0bd 100755 --- a/common_components/heap/ark_collector/tests/remark_barrier_test.cpp +++ b/common_components/heap/ark_collector/tests/remark_barrier_test.cpp @@ -140,7 +140,7 @@ HWTEST_F_L0(RemarkBarrierTest, ReadStringTableStaticRef_TEST4) BaseObject* obj = reinterpret_cast(addr); RefField field(obj); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); BaseObject* resultObj = remarkBarrier->ReadStringTableStaticRef(field); ASSERT_TRUE(resultObj != nullptr); } diff --git a/common_components/heap/collector/collector_proxy.cpp b/common_components/heap/collector/collector_proxy.cpp index 89720ead1f..5577e3d032 100755 --- a/common_components/heap/collector/collector_proxy.cpp +++ b/common_components/heap/collector/collector_proxy.cpp @@ -28,14 +28,9 @@ void CollectorProxy::Fini() { arkCollector_.Fini(); } void CollectorProxy::RunGarbageCollection(uint64_t gcIndex, GCReason reason, GCType gcType) { - switch (reason) { - case GC_REASON_HEU: - case GC_REASON_YOUNG: - case GC_REASON_BACKUP: - currentCollector_ = &arkCollector_; - break; - case GC_REASON_OOM: - case GC_REASON_FORCE: + switch (gcType) { + case GC_TYPE_FULL: + case GC_TYPE_YOUNG: currentCollector_ = &arkCollector_; break; default: diff --git a/common_components/heap/collector/collector_resources.cpp b/common_components/heap/collector/collector_resources.cpp index e73d163b71..6882fd489c 100755 --- a/common_components/heap/collector/collector_resources.cpp +++ b/common_components/heap/collector/collector_resources.cpp @@ -14,6 +14,7 @@ */ #include "common_components/heap/collector/collector_resources.h" +#include #include #include "common_components/base/sys_call.h" @@ -146,6 +147,12 @@ void CollectorResources::PostIgnoredGcRequest(GCReason reason) } } +void CollectorResources::ClearRequestGCInfo() +{ + requestGCPending_.store(false, std::memory_order_relaxed); + requestGCType_.store(GCType::GC_TYPE_NONE, std::memory_order_relaxed); +} + void CollectorResources::RequestAsyncGC(GCReason reason, GCType gcType) { // The gc request must be none blocked @@ -153,7 +160,13 @@ void CollectorResources::RequestAsyncGC(GCReason reason, GCType gcType) GCRunner gcTask(GCTask::GCTaskType::GC_TASK_INVOKE_GC, reason, gcType); // we use async enqueue because this doesn't have locks, lowering the risk // of timeouts when entering safe region due to thread scheduling - taskQueue_->EnqueueAsync(gcTask); + if (GetRequestGCType() < gcType) { + requestGCType_.store(gcType, std::memory_order_relaxed); + } + bool expected = false; + if (requestGCPending_.compare_exchange_strong(expected, true, std::memory_order_seq_cst)) { + taskQueue_->EnqueueAsync(gcTask); + } } void CollectorResources::RequestGCAndWait(GCReason reason, GCType gcType) @@ -163,12 +176,14 @@ void CollectorResources::RequestGCAndWait(GCReason reason, GCType gcType) GCRunner gcTask(GCTask::GCTaskType::GC_TASK_INVOKE_GC, reason, gcType); GCTaskQueue::GCTaskFilter filter = [](GCRunner& oldTask, GCRunner& newTask) { + // Todo xiongluo filter return oldTask.GetGCReason() == newTask.GetGCReason(); }; GCRequest& request = g_gcRequests[reason]; // If this gcTask need not to block, just add to async queue - if (!request.IsSyncGC()) { + bool expected = false; + if (!request.IsSyncGC() && requestGCPending_.compare_exchange_strong(expected, true, std::memory_order_seq_cst)) { taskQueue_->EnqueueAsync(gcTask); return; } diff --git a/common_components/heap/collector/collector_resources.h b/common_components/heap/collector/collector_resources.h index ebfd7e582d..8bc10bd64a 100755 --- a/common_components/heap/collector/collector_resources.h +++ b/common_components/heap/collector/collector_resources.h @@ -71,6 +71,13 @@ public: void MarkGCStart(); void MarkGCFinish(uint64_t gcIndex = 0); + void ClearRequestGCInfo(); + + GCType GetRequestGCType() const + { + return requestGCType_.load(std::memory_order_relaxed); + } + private: // Notify that GC has finished. void NotifyGCFinished(uint64_t gcIndex); @@ -89,6 +96,8 @@ private: Taskpool *gcThreadPool_ = nullptr; uint32_t gcThreadCount_ = 1; GCTaskQueue* taskQueue_ = nullptr; + std::atomic requestGCPending_ = {false}; + std::atomic requestGCType_ = {GCType::GC_TYPE_NONE}; // the collector thread handle. pthread_t gcMainThread_ = 0; diff --git a/common_components/heap/collector/gc_stats.h b/common_components/heap/collector/gc_stats.h index ceb21991b8..aecb70d380 100755 --- a/common_components/heap/collector/gc_stats.h +++ b/common_components/heap/collector/gc_stats.h @@ -104,7 +104,7 @@ public: bool isYoungGC() { - return reason == GCReason::GC_REASON_YOUNG; + return gcType == GCType::GC_TYPE_YOUNG; } }; extern size_t g_gcCount; diff --git a/common_components/heap/collector/marking_collector.cpp b/common_components/heap/collector/marking_collector.cpp index b8dbc386eb..488436c171 100755 --- a/common_components/heap/collector/marking_collector.cpp +++ b/common_components/heap/collector/marking_collector.cpp @@ -381,7 +381,7 @@ bool MarkingCollector::AddWeakStackClearWork(WeakStack &weakStack, bool MarkingCollector::PushRootToWorkStack(RootSet *workStack, BaseObject *obj) { RegionDesc *regionInfo = RegionDesc::GetAliveRegionDescAt(reinterpret_cast(obj)); - if (gcReason_ == GCReason::GC_REASON_YOUNG && !regionInfo->IsInYoungSpace()) { + if (IsYoungGC() && !regionInfo->IsInYoungSpace()) { DLOG(ENUM, "enum: skip old object %p<%p>(%zu)", obj, obj->GetTypeInfo(), obj->GetSize()); return false; } @@ -415,7 +415,7 @@ void MarkingCollector::MarkingRoots(const CArrayList &collectedRoo WorkStack workStack = NewWorkStack(); PushRootsToWorkStack(&workStack, collectedRoots); - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { OHOS_HITRACE(HITRACE_LEVEL_COMMERCIAL, "CMCGC::PushRootInRSet", ""); auto func = [this, &workStack](BaseObject *object) { MarkRememberSetImpl(object, workStack); }; RegionalHeap &space = reinterpret_cast(Heap::GetHeap().GetAllocator()); @@ -458,7 +458,7 @@ void MarkingCollector::ClearWeakStack(bool parallel) { OHOS_HITRACE(HITRACE_LEVEL_COMMERCIAL, "CMCGC::ProcessGlobalWeakStack", ""); { - if (gcReason_ == GC_REASON_YOUNG || globalWeakStack_.empty()) { + if (IsYoungGC() || globalWeakStack_.empty()) { return; } Taskpool *threadPool = GetThreadPool(); @@ -758,7 +758,7 @@ void MarkingCollector::RunGarbageCollection(uint64_t gcIndex, GCReason reason, G // this may be removed in the future. ScopedSTWLock stwLock; PreGarbageCollection(true); - Heap::GetHeap().SetGCReason(reason); + Heap::GetHeap().SetGCType(gcType); GCStats& gcStats = GetGCStats(); DoGarbageCollection(); diff --git a/common_components/heap/collector/marking_collector.h b/common_components/heap/collector/marking_collector.h index d15c225a87..8c6025ebbb 100755 --- a/common_components/heap/collector/marking_collector.h +++ b/common_components/heap/collector/marking_collector.h @@ -241,6 +241,11 @@ public: void CopyObject(const BaseObject& fromObj, BaseObject& toObj, size_t size) const; + bool IsYoungGC() const + { + return gcType_ == GC_TYPE_YOUNG; + } + protected: virtual BaseObject* CopyObjectAfterExclusive(BaseObject* obj) = 0; virtual void CopyFromSpace(); @@ -295,7 +300,7 @@ protected: return workStack; } - inline void SetGCReason(const GCReason reason) { gcReason_ = reason; } + inline void SetGCType(const GCType type) { gcType_ = type; } Taskpool *GetThreadPool() const { return collectorResources_.GetThreadPool(); } diff --git a/common_components/heap/collector/task_queue.cpp b/common_components/heap/collector/task_queue.cpp index dd49c291a1..be377d10ad 100755 --- a/common_components/heap/collector/task_queue.cpp +++ b/common_components/heap/collector/task_queue.cpp @@ -28,9 +28,15 @@ bool GCRunner::Execute(void* owner) return false; } case GCTask::GCTaskType::GC_TASK_INVOKE_GC: { + CollectorResources& resourceces = Heap::GetHeap().GetCollectorResources(); + GCType requestGCType = resourceces.GetRequestGCType(); + if (requestGCType != GCType::GC_TYPE_NONE && requestGCType > gcType_) { + gcType_ = requestGCType; + } GCStats::SetPrevGCStartTime(TimeUtil::NanoSeconds()); collectorProxy->RunGarbageCollection(taskIndex_, gcReason_, gcType_); GCStats::SetPrevGCFinishTime(TimeUtil::NanoSeconds()); + resourceces.ClearRequestGCInfo(); break; } case GCTask::GCTaskType::GC_TASK_DUMP_HEAP: { //LCOV_EXCL_BR_LINE diff --git a/common_components/heap/collector/tests/collector_proxy_test.cpp b/common_components/heap/collector/tests/collector_proxy_test.cpp index 2baca36eb1..d0da273018 100644 --- a/common_components/heap/collector/tests/collector_proxy_test.cpp +++ b/common_components/heap/collector/tests/collector_proxy_test.cpp @@ -36,9 +36,10 @@ protected: HWTEST_F_L0(CollectorProxyTest, RunGarbageCollection) { - CollectorProxy collectorProxy(Heap::GetHeap().GetAllocator(), Heap::GetHeap().GetCollectorResources()); - Heap::GetHeap().SetGCReason(GCReason::GC_REASON_OOM); - collectorProxy.RunGarbageCollection(0, GCReason::GC_REASON_OOM, GCType::GC_TYPE_BEGIN); - ASSERT_TRUE(Heap::GetHeap().GetGCReason() == GCReason::GC_REASON_OOM); + // Todo later xiongluo + // CollectorProxy collectorProxy(Heap::GetHeap().GetAllocator(), Heap::GetHeap().GetCollectorResources()); + // Heap::GetHeap().SetGCReason(GCReason::GC_REASON_OOM); + // collectorProxy.RunGarbageCollection(0, GCReason::GC_REASON_OOM, GCType::GC_TYPE_BEGIN); + // ASSERT_TRUE(Heap::GetHeap().GetGCReason() == GCReason::GC_REASON_OOM); } } // namespace common::test \ No newline at end of file diff --git a/common_components/heap/collector/tests/marking_collector_test.cpp b/common_components/heap/collector/tests/marking_collector_test.cpp index 616de32727..06c784b625 100755 --- a/common_components/heap/collector/tests/marking_collector_test.cpp +++ b/common_components/heap/collector/tests/marking_collector_test.cpp @@ -61,7 +61,7 @@ protected: } class TableMarkingCollctor : public MarkingCollector { public: - using MarkingCollector::SetGCReason; + using MarkingCollector::SetGCType; using MarkingCollector::MarkingRoots; using MarkingCollector::PushRootToWorkStack; using MarkingCollector::UpdateNativeThreshold; @@ -71,11 +71,11 @@ protected: HWTEST_F_L0(MarkingCollectorTest, RunGarbageCollection) { MarkingCollector& collector = reinterpret_cast(Heap::GetHeap().GetCollector()); - Heap::GetHeap().SetGCReason(GCReason::GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GCType::GC_TYPE_YOUNG); collector.RunGarbageCollection(0, GCReason::GC_REASON_USER, common::GC_TYPE_FULL); ASSERT_FALSE(Heap::GetHeap().GetCollector().GetGCStats().isYoungGC()); - Heap::GetHeap().SetGCReason(GCReason::GC_REASON_BACKUP); + Heap::GetHeap().SetGCType(GCType::GC_TYPE_FULL); collector.RunGarbageCollection(0, GCReason::GC_REASON_OOM, common::GC_TYPE_FULL); ASSERT_FALSE(Heap::GetHeap().GetCollector().GetGCStats().isYoungGC()); } @@ -83,8 +83,8 @@ HWTEST_F_L0(MarkingCollectorTest, RunGarbageCollection) HWTEST_F_L0(MarkingCollectorTest, RunGarbageCollectionTest2) { MarkingCollector& collector = reinterpret_cast(Heap::GetHeap().GetCollector()); - Heap::GetHeap().SetGCReason(GCReason::GC_REASON_YOUNG); - collector.RunGarbageCollection(0, GCReason::GC_REASON_YOUNG, common::GC_TYPE_FULL); + Heap::GetHeap().SetGCType(GCType::GC_TYPE_YOUNG); + collector.RunGarbageCollection(0, GCReason::GC_REASON_YOUNG, common::GC_TYPE_YOUNG); ASSERT_TRUE(Heap::GetHeap().GetCollector().GetGCStats().isYoungGC()); } @@ -120,8 +120,8 @@ HWTEST_F_L0(MarkingCollectorTest, MarkingRootsTest) BaseObject* obj = reinterpret_cast(addr); RegionDesc* region = RegionDesc::GetRegionDescAt(addr); region->SetRegionType(RegionDesc::RegionType::OLD_REGION); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); - collector.SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); + collector.SetGCType(GC_TYPE_YOUNG); roots.push_back(obj); collector.MarkingRoots(roots); @@ -138,18 +138,18 @@ HWTEST_F_L0(MarkingCollectorTest, PushRootToWorkStackTest) RootSet roots; RegionDesc* region = RegionDesc::GetRegionDescAt(addr); region->SetRegionType(RegionDesc::RegionType::RECENT_LARGE_REGION); - collector.SetGCReason(GC_REASON_NATIVE); + collector.SetGCType(GC_TYPE_FULL); region->MarkObject(obj); bool result = collector.PushRootToWorkStack(&roots, obj); ASSERT_FALSE(result); region->SetRegionType(RegionDesc::RegionType::RECENT_LARGE_REGION); - collector.SetGCReason(GC_REASON_YOUNG); + collector.SetGCType(GC_TYPE_YOUNG); result = collector.PushRootToWorkStack(&roots, obj); ASSERT_FALSE(result); region->SetRegionType(RegionDesc::RegionType::OLD_REGION); - collector.SetGCReason(GC_REASON_NATIVE); + collector.SetGCType(GC_TYPE_FULL); result = collector.PushRootToWorkStack(&roots, obj); ASSERT_FALSE(result); } diff --git a/common_components/heap/heap.cpp b/common_components/heap/heap.cpp index 29d5aca830..bc2d78e966 100644 --- a/common_components/heap/heap.cpp +++ b/common_components/heap/heap.cpp @@ -81,9 +81,9 @@ public: void EnableGC(bool val) override { return isGCEnabled_.store(val); } - GCReason GetGCReason() override { return gcReason_; } + GCType GetGCType() override { return gcType_; } - void SetGCReason(GCReason reason) override { gcReason_ = reason; } + void SetGCType(GCType type) override { gcType_ = type; } bool InRecentSpace(const void *addr) override { @@ -160,7 +160,7 @@ private: std::atomic isGCEnabled_ = { true }; - GCReason gcReason_ = GCReason::GC_REASON_INVALID; + GCType gcType_ = GCType::GC_TYPE_NONE; bool isForceThrowOOM_ = { false }; }; // end class HeapImpl diff --git a/common_components/heap/heap.h b/common_components/heap/heap.h index e3b548e9df..41cfaba0ff 100755 --- a/common_components/heap/heap.h +++ b/common_components/heap/heap.h @@ -188,9 +188,9 @@ public: virtual void StopGCWork() = 0; - virtual GCReason GetGCReason() = 0; + virtual GCType GetGCType() = 0; - virtual void SetGCReason(GCReason reason) = 0; + virtual void SetGCType(GCType type) = 0; virtual bool InRecentSpace(const void *addr) = 0; virtual bool GetForceThrowOOM() const = 0; diff --git a/common_components/heap/space/appspawn_space.h b/common_components/heap/space/appspawn_space.h index bbd75fc42c..9f1c8b64be 100644 --- a/common_components/heap/space/appspawn_space.h +++ b/common_components/heap/space/appspawn_space.h @@ -61,7 +61,7 @@ public: void CollectFixTasks(FixHeapTaskList& taskList) { - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { FixHeapWorker::CollectFixHeapTasks(taskList, appSpawnRegionList_, FIX_OLD_REGION); } else { FixHeapWorker::CollectFixHeapTasks(taskList, appSpawnRegionList_, FIX_REGION); diff --git a/common_components/heap/space/large_space.cpp b/common_components/heap/space/large_space.cpp index 5a951ed0eb..7d5294e228 100644 --- a/common_components/heap/space/large_space.cpp +++ b/common_components/heap/space/large_space.cpp @@ -30,7 +30,7 @@ void LargeSpace::AssembleGarbageCandidates() void LargeSpace::CollectFixTasks(FixHeapTaskList& taskList) { - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { FixHeapWorker::CollectFixHeapTasks(taskList, largeRegionList_, FIX_OLD_REGION); FixHeapWorker::CollectFixHeapTasks(taskList, recentLargeRegionList_, FIX_RECENT_OLD_REGION); } else { diff --git a/common_components/heap/space/nonmovable_space.cpp b/common_components/heap/space/nonmovable_space.cpp index e5217d3e45..129da2be82 100644 --- a/common_components/heap/space/nonmovable_space.cpp +++ b/common_components/heap/space/nonmovable_space.cpp @@ -67,7 +67,7 @@ void CollectFixHeapTaskForFullRegion(MarkingCollector &collector, RegionList &li void NonMovableSpace::CollectFixTasks(FixHeapTaskList &taskList) { // fix all objects. - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { FixHeapWorker::CollectFixHeapTasks(taskList, recentPolySizeRegionList_, FIX_RECENT_OLD_REGION); FixHeapWorker::CollectFixHeapTasks(taskList, polySizeRegionList_, FIX_OLD_REGION); diff --git a/common_components/heap/space/old_space.h b/common_components/heap/space/old_space.h index 7d77b47c91..303d8455df 100644 --- a/common_components/heap/space/old_space.h +++ b/common_components/heap/space/old_space.h @@ -39,7 +39,7 @@ public: void CollectFixTasks(FixHeapTaskList &taskList) { - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { FixHeapWorker::CollectFixHeapTasks(taskList, oldRegionList_, FIX_OLD_REGION); std::lock_guard lock(lock_); FixHeapWorker::CollectFixHeapTasks(taskList, tlOldRegionList_, FIX_RECENT_OLD_REGION); diff --git a/common_components/heap/space/rawpointer_space.h b/common_components/heap/space/rawpointer_space.h index 03e5a2ec6c..9de5ce2765 100644 --- a/common_components/heap/space/rawpointer_space.h +++ b/common_components/heap/space/rawpointer_space.h @@ -60,7 +60,7 @@ public: void CollectFixTasks(FixHeapTaskList& taskList) { - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { FixHeapWorker::CollectFixHeapTasks(taskList, rawPointerRegionList_, FIX_OLD_REGION); } else { FixHeapWorker::CollectFixHeapTasks(taskList, rawPointerRegionList_, FIX_REGION); diff --git a/common_components/heap/tests/heap_manager_test.cpp b/common_components/heap/tests/heap_manager_test.cpp index 7721f429c2..19d3cee0f5 100644 --- a/common_components/heap/tests/heap_manager_test.cpp +++ b/common_components/heap/tests/heap_manager_test.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ +#include "common_interfaces/base_runtime.h" #include "common_components/heap/heap.h" #include "common_components/heap/heap_manager.h" #include "common_components/tests/test_helper.h" @@ -31,11 +32,11 @@ HWTEST_F_L0(HeapManagerTest, RequestGC) { HeapManager manager; Heap::GetHeap().EnableGC(false); - manager.RequestGC(GCReason::GC_REASON_USER, true, common::GC_TYPE_FULL); + manager.RequestGC(common::GCReason::GC_REASON_USER, true, common::GCType::GC_TYPE_FULL); ASSERT_FALSE(Heap::GetHeap().IsGCEnabled()); Heap::GetHeap().EnableGC(true); - manager.RequestGC(GCReason::GC_REASON_USER, true, common::GC_TYPE_FULL); + manager.RequestGC(common::GCReason::GC_REASON_USER, true, common::GCType::GC_TYPE_FULL); ASSERT_TRUE(Heap::GetHeap().IsGCEnabled()); } } // namespace common::test \ No newline at end of file diff --git a/common_components/heap/tests/verification_test.cpp b/common_components/heap/tests/verification_test.cpp index 1709de37c1..fb0a90bf88 100644 --- a/common_components/heap/tests/verification_test.cpp +++ b/common_components/heap/tests/verification_test.cpp @@ -234,11 +234,11 @@ HWTEST_F_L0(VerificationTest, VerifyRefImplTest) TestBaseObjectOperator operatorImpl; BaseObject::RegisterDynamic(&operatorImpl); operatorImpl.SetValidObject(true); - Heap::GetHeap().SetGCReason(GCReason::GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GCType::GC_TYPE_YOUNG); operatorImpl.SetSize(BaseObject::BaseObjectSize()); AfterMarkVisitor visitor; visitor.VerifyRefImpl(nullptr, oldField); - ASSERT_TRUE(Heap::GetHeap().GetGCReason() == GCReason::GC_REASON_YOUNG); + ASSERT_TRUE(Heap::GetHeap().GetGCType() == GCType::GC_TYPE_YOUNG); ASSERT_TRUE(Heap::IsTaggedObject(oldField.GetFieldValue())); AfterMarkVisitor visitor1; @@ -254,11 +254,11 @@ HWTEST_F_L0(VerificationTest, VerifyRefImplTest1) TestBaseObjectOperator operatorImpl; BaseObject::RegisterDynamic(&operatorImpl); operatorImpl.SetValidObject(true); - Heap::GetHeap().SetGCReason(GCReason::GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GCType::GC_TYPE_YOUNG); operatorImpl.SetSize(BaseObject::BaseObjectSize()); AfterMarkVisitor visitor; visitor.VerifyRefImpl(obj, oldField); - ASSERT_TRUE(Heap::GetHeap().GetGCReason() == GCReason::GC_REASON_YOUNG); + ASSERT_TRUE(Heap::GetHeap().GetGCType() == GCType::GC_TYPE_YOUNG); ASSERT_TRUE(Heap::IsTaggedObject(oldField.GetFieldValue())); } diff --git a/common_components/heap/verification.cpp b/common_components/heap/verification.cpp index b67fea77b6..2f869d7b90 100755 --- a/common_components/heap/verification.cpp +++ b/common_components/heap/verification.cpp @@ -234,7 +234,7 @@ public: } } - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { CHECKF(RegionalHeap::IsResurrectedObject(refObj) || RegionalHeap::IsMarkedObject(refObj) || RegionalHeap::IsNewObjectSinceMarking(refObj) || diff --git a/common_components/mutator/satb_buffer.cpp b/common_components/mutator/satb_buffer.cpp index 68c9d42ce4..dc3c359bbe 100755 --- a/common_components/mutator/satb_buffer.cpp +++ b/common_components/mutator/satb_buffer.cpp @@ -28,7 +28,7 @@ bool SatbBuffer::ShouldEnqueue(const BaseObject* obj) if (UNLIKELY_CC(obj == nullptr)) { return false; } - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG && !RegionalHeap::IsYoungSpaceObject(obj)) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG && !RegionalHeap::IsYoungSpaceObject(obj)) { return false; } if (RegionalHeap::IsNewObjectSinceMarking(obj)) { diff --git a/common_components/mutator/tests/satb_buffer_test.cpp b/common_components/mutator/tests/satb_buffer_test.cpp index 9ad478220c..c978a61d73 100755 --- a/common_components/mutator/tests/satb_buffer_test.cpp +++ b/common_components/mutator/tests/satb_buffer_test.cpp @@ -66,7 +66,7 @@ HWTEST_F_L0(SatbBufferTest, IsYoungSpaceObject1) ASSERT_NE(addr, 0); RegionDesc* region = RegionDesc::GetRegionDescAt(addr); region->SetRegionType(RegionDesc::RegionType::ALIVE_REGION_FIRST); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); BaseObject* obj = reinterpret_cast(addr); EXPECT_FALSE(SatbBuffer::Instance().ShouldEnqueue(obj)); @@ -81,7 +81,7 @@ HWTEST_F_L0(SatbBufferTest, IsYoungSpaceObject2) ASSERT_NE(addr, 0); RegionDesc* region = RegionDesc::GetRegionDescAt(addr); region->SetRegionType(RegionDesc::RegionType::FROM_REGION); - Heap::GetHeap().SetGCReason(GC_REASON_HEU); + Heap::GetHeap().SetGCType(GC_TYPE_FULL); BaseObject* obj = reinterpret_cast(addr); EXPECT_FALSE(SatbBuffer::Instance().ShouldEnqueue(obj)); @@ -96,7 +96,7 @@ HWTEST_F_L0(SatbBufferTest, IsYoungSpaceObject3) ASSERT_NE(addr, 0); RegionDesc* region = RegionDesc::GetRegionDescAt(addr); region->SetRegionType(RegionDesc::RegionType::FROM_REGION); - Heap::GetHeap().SetGCReason(GC_REASON_YOUNG); + Heap::GetHeap().SetGCType(GC_TYPE_YOUNG); BaseObject* obj = reinterpret_cast(addr); EXPECT_FALSE(SatbBuffer::Instance().ShouldEnqueue(obj)); @@ -111,7 +111,7 @@ HWTEST_F_L0(SatbBufferTest, IsYoungSpaceObject4) ASSERT_NE(addr, 0); RegionDesc* region = RegionDesc::GetRegionDescAt(addr); region->SetRegionType(RegionDesc::RegionType::ALIVE_REGION_FIRST); - Heap::GetHeap().SetGCReason(GC_REASON_HEU); + Heap::GetHeap().SetGCType(GC_TYPE_FULL); BaseObject* obj = reinterpret_cast(addr); EXPECT_FALSE(SatbBuffer::Instance().ShouldEnqueue(obj)); } @@ -122,7 +122,7 @@ HWTEST_F_L0(SatbBufferTest, IsMarkedObject) uintptr_t addr = theAllocator.AllocOldRegion(); ASSERT_NE(addr, 0U); BaseObject* obj = reinterpret_cast(addr); - Heap::GetHeap().SetGCReason(GC_REASON_HEU); + Heap::GetHeap().SetGCType(GC_TYPE_FULL); RegionDesc* region = RegionDesc::GetRegionDescAt(reinterpret_cast(obj)); region->SetMarkedRegionFlag(1); @@ -165,7 +165,7 @@ HWTEST_F_L0(SatbBufferTest, EnqueueObject) uintptr_t objAddress = addr + 0x100; BaseObject* obj = reinterpret_cast(objAddress); - Heap::GetHeap().SetGCReason(GC_REASON_HEU); + Heap::GetHeap().SetGCType(GC_TYPE_FULL); RegionDesc* region = RegionDesc::GetRegionDescAt(reinterpret_cast(obj)); region->SetRegionType(RegionDesc::RegionType::FROM_REGION); diff --git a/ecmascript/compiler/stub_builder.cpp b/ecmascript/compiler/stub_builder.cpp index 2f3bdd3aef..bdf5fce675 100644 --- a/ecmascript/compiler/stub_builder.cpp +++ b/ecmascript/compiler/stub_builder.cpp @@ -1952,12 +1952,12 @@ GateRef StubBuilder::GetGCPhase(GateRef glue) return gcPhase; } -GateRef StubBuilder::GetGCReason(GateRef glue) +GateRef StubBuilder::GetGCType(GateRef glue) { - GateRef gcReason = LoadPrimitive(VariableType::INT32(), glue, + GateRef gcType = LoadPrimitive(VariableType::INT32(), glue, Int64(JSThread::GlueData::GetSharedGCStateBitFieldOffset(false) + - JSThread::CMCGCReasonBits::START_BIT / BITS_PER_BYTE)); - return gcReason; + JSThread::CMCGCTypeBits::START_BIT / BITS_PER_BYTE)); + return gcType; } void StubBuilder::MarkRSetCardTable(GateRef obj, Label *exit) @@ -1985,15 +1985,15 @@ void StubBuilder::MarkRSetCardTable(GateRef obj, Label *exit) } } -GateRef StubBuilder::ShouldGetGCReason(GateRef gcPhase) +GateRef StubBuilder::ShouldGetGCType(GateRef gcPhase) { auto env = GetEnvironment(); - GateRef shouldGetGCReason = LogicOrBuilder(env) + GateRef shouldGetGCType = LogicOrBuilder(env) .Or(Int8Equal(gcPhase, Int8(common::GCPhase::GC_PHASE_ENUM))) .Or(Int8Equal(gcPhase, Int8(common::GCPhase::GC_PHASE_MARK))) .Or(Int8Equal(gcPhase, Int8(common::GCPhase::GC_PHASE_POST_MARK))) .Done(); - return shouldGetGCReason; + return shouldGetGCType; } GateRef StubBuilder::ShouldProcessSATB(GateRef gcPhase) @@ -2020,12 +2020,12 @@ GateRef StubBuilder::ShouldUpdateRememberSet(GateRef glue, GateRef gcPhase) DEFVARIABLE(result, VariableType::BOOL(), True()); BRANCH(Int8Equal(gcPhase, Int8(common::GCPhase::GC_PHASE_IDLE)), &exit, ¬IdlePhase); Bind(¬IdlePhase); - GateRef gcReason = GetGCReason(glue); - Label reasonNotYoung(env); - BRANCH(Int32Equal(gcReason, Int32(common::GCReason::GC_REASON_YOUNG)), &exit, &reasonNotYoung); - Bind(&reasonNotYoung); - GateRef shouldGetGCReason = ShouldGetGCReason(gcPhase); - BRANCH(BoolNot(shouldGetGCReason), &exit, ¬MarkRSet); + GateRef gcReason = GetGCType(glue); + Label isYoungGC(env); + BRANCH(Int32Equal(gcReason, Int32(common::GCType::GC_TYPE_YOUNG)), &exit, &isYoungGC); + Bind(&isYoungGC); + GateRef shouldGetGCType = ShouldGetGCType(gcPhase); + BRANCH(BoolNot(shouldGetGCType), &exit, ¬MarkRSet); Bind(¬MarkRSet); result = False(); Jump(&exit); diff --git a/ecmascript/compiler/stub_builder.h b/ecmascript/compiler/stub_builder.h index e8c38aa53c..29d18f55c5 100644 --- a/ecmascript/compiler/stub_builder.h +++ b/ecmascript/compiler/stub_builder.h @@ -825,11 +825,11 @@ public: GateRef GetCMCRegionRSet(GateRef obj); GateRef GetCMCRegionType(GateRef obj); GateRef GetGCPhase(GateRef glue); - GateRef GetGCReason(GateRef glue); + GateRef GetGCType(GateRef glue); GateRef CMCIsInYoungSpace(GateRef regionType); GateRef IsOldToYoung(GateRef objRegionType, GateRef valueRegionType); void MarkRSetCardTable(GateRef obj, Label *exit); - GateRef ShouldGetGCReason(GateRef gcPhase); + GateRef ShouldGetGCType(GateRef gcPhase); GateRef ShouldProcessSATB(GateRef gcPhase); GateRef ShouldUpdateRememberSet(GateRef glue, GateRef gcPhase); GateRef NeedSkipReadBarrier(GateRef glue); diff --git a/ecmascript/js_thread.h b/ecmascript/js_thread.h index 6ac6e1e9ee..8e04283f1c 100644 --- a/ecmascript/js_thread.h +++ b/ecmascript/js_thread.h @@ -167,7 +167,7 @@ public: static constexpr int CMC_GC_PHASE_BITFIELD_NUM = 8; static constexpr int CMC_GC_PHASE_BITFIELD_MASK = (((1 << CMC_GC_PHASE_BITFIELD_NUM) - 1) << CMC_GC_PHASE_BITFIELD_START); - static constexpr int CMC_GC_REASON_BITFIELD_NUM = 32; + static constexpr int CMC_GC_TYPE_BITFIELD_NUM = 32; static constexpr int CHECK_SAFEPOINT_BITFIELD_NUM = 8; static constexpr int PGO_PROFILER_BITFIELD_START = 16; static constexpr int BOOL_BITFIELD_NUM = 1; @@ -178,7 +178,7 @@ public: using SharedMarkStatusBits = BitField; // 0 using ReadBarrierStateBit = SharedMarkStatusBits::NextFlag; // 1 using CMCGCPhaseBits = BitField; // 8-15 - using CMCGCReasonBits = CMCGCPhaseBits::NextField; + using CMCGCTypeBits = CMCGCPhaseBits::NextField; using CheckSafePointBit = BitField; using VMNeedSuspensionBit = BitField; using VMHasSuspendedBit = VMNeedSuspensionBit::NextFlag; @@ -593,14 +593,14 @@ public: CMCGCPhaseBits::Set(gcPhase, &glueData_.sharedGCStateBitField_); } - common::GCReason GetCMCGCReason() const + common::GCType GetCMCGCReason() const { - return CMCGCReasonBits::Decode(glueData_.sharedGCStateBitField_); + return CMCGCTypeBits::Decode(glueData_.sharedGCStateBitField_); } - void SetCMCGCReason(common::GCReason gcReason) + void SetCMCGCType(common::GCType gcType) { - CMCGCReasonBits::Set(gcReason, &glueData_.sharedGCStateBitField_); + CMCGCTypeBits::Set(gcType, &glueData_.sharedGCStateBitField_); } void SetPGOProfilerEnable(bool enable) diff --git a/ecmascript/mem/barriers.cpp b/ecmascript/mem/barriers.cpp index d112ebc9a2..b9aafe5391 100644 --- a/ecmascript/mem/barriers.cpp +++ b/ecmascript/mem/barriers.cpp @@ -144,7 +144,7 @@ bool Barriers::ShouldProcessSATB(common::GCPhase gcPhase) } } -bool Barriers::ShouldGetGCReason(common::GCPhase gcPhase) +bool Barriers::ShouldGetGCType(common::GCPhase gcPhase) { switch (gcPhase) { case common::GCPhase::GC_PHASE_ENUM: @@ -158,7 +158,7 @@ bool Barriers::ShouldGetGCReason(common::GCPhase gcPhase) bool Barriers::ShouldUpdateRememberSet(common::GCPhase gcPhase) { - if (common::Heap::GetHeap().GetGCReason() == common::GC_REASON_YOUNG || !ShouldGetGCReason(gcPhase)) { + if (common::Heap::GetHeap().GetGCType() == common::GC_TYPE_YOUNG || !ShouldGetGCType(gcPhase)) { return true; } return false; diff --git a/ecmascript/mem/barriers.h b/ecmascript/mem/barriers.h index 478f965378..ee6e7c3866 100644 --- a/ecmascript/mem/barriers.h +++ b/ecmascript/mem/barriers.h @@ -118,7 +118,7 @@ public: static void PUBLIC_API CMCArrayCopyWriteBarrier(const JSThread *thread, const TaggedObject *dstObj, void* src, void* dst, size_t count); static bool ShouldProcessSATB(common::GCPhase gcPhase); - static bool ShouldGetGCReason(common::GCPhase gcPhase); + static bool ShouldGetGCType(common::GCPhase gcPhase); static bool ShouldUpdateRememberSet(common::GCPhase gcPhase); static void CMCArrayCopyReadBarrierForward(const JSThread *thread, JSTaggedValue* dst, const JSTaggedValue* src, diff --git a/ecmascript/mem/cmc_gc/hooks.cpp b/ecmascript/mem/cmc_gc/hooks.cpp index 18fb9f4ec0..98aafdfb9d 100644 --- a/ecmascript/mem/cmc_gc/hooks.cpp +++ b/ecmascript/mem/cmc_gc/hooks.cpp @@ -275,7 +275,7 @@ void VisitJSThread(void *jsThread, CommonRootVisitor visitor) void SynchronizeGCPhaseToJSThread(void *jsThread, GCPhase gcPhase) { reinterpret_cast(jsThread)->SetCMCGCPhase(gcPhase); - reinterpret_cast(jsThread)->SetCMCGCReason(Heap::GetHeap().GetGCReason()); + reinterpret_cast(jsThread)->SetCMCGCType(Heap::GetHeap().GetGCType()); if (panda::ecmascript::g_isEnableCMCGC) { // forcely enable read barrier for read barrier DFX #ifdef ENABLE_CMC_RB_DFX @@ -305,7 +305,7 @@ void SweepThreadLocalJitFort() runtime->GCIterateThreadList([&](JSThread* thread) { if (thread->IsJSThread()) { auto vm = thread->GetEcmaVM(); - if (Heap::GetHeap().GetGCReason() == GC_REASON_YOUNG) { + if (Heap::GetHeap().GetGCType() == GC_TYPE_YOUNG) { // JitFort space does not have generational feature, so far we have to assume all JitFort code is in // oldspace after creation. const_cast(vm->GetHeap())->GetMachineCodeSpace()->ClearMarkBits(); -- Gitee