1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ECMASCRIPT_MEM_SHARED_HEAP_SHARED_FULL_GC_H 17 #define ECMASCRIPT_MEM_SHARED_HEAP_SHARED_FULL_GC_H 18 19 #include "ecmascript/mem/garbage_collector.h" 20 #include "ecmascript/mem/heap.h" 21 #include "ecmascript/mem/mark_stack.h" 22 #include "ecmascript/mem/mark_word.h" 23 #include "ecmascript/mem/mem.h" 24 #include "ecmascript/mem/work_manager.h" 25 26 namespace panda::ecmascript { 27 class SharedGCMovableMarker; 28 enum class SharedMarkType : uint8_t; 29 30 class SharedFullGC : public GarbageCollector { 31 public: SharedFullGC(SharedHeap * heap)32 explicit SharedFullGC(SharedHeap *heap) : sHeap_(heap), sWorkManager_(heap->GetWorkManager()) {} 33 ~SharedFullGC() override = default; 34 NO_COPY_SEMANTIC(SharedFullGC); 35 NO_MOVE_SEMANTIC(SharedFullGC); 36 37 void RunPhases() override; 38 void ResetWorkManager(SharedGCWorkManager *workManager); SetForAppSpawn(bool flag)39 void SetForAppSpawn(bool flag) 40 { 41 isAppspawn_ = flag; 42 } 43 protected: 44 void Initialize() override; 45 void Mark() override; 46 void Sweep() override; 47 void Finish() override; 48 49 private: 50 void MarkRoots(SharedMarkType markType, VMRootVisitType type); 51 void UpdateRecordWeakReference(); 52 bool HasEvacuated(Region *region); 53 54 SharedHeap *sHeap_ {nullptr}; 55 SharedGCWorkManager *sWorkManager_ {nullptr}; 56 bool isAppspawn_ {false}; 57 }; 58 59 class SharedFullGCMarkRootVisitor final : public RootVisitor { 60 public: 61 explicit SharedFullGCMarkRootVisitor(SharedGCMovableMarker *marker, uint32_t threadId); 62 ~SharedFullGCMarkRootVisitor() override = default; 63 64 void VisitRoot([[maybe_unused]] Root type, ObjectSlot slot) override; 65 66 void VisitRangeRoot([[maybe_unused]] Root type, ObjectSlot start, ObjectSlot end) override; 67 68 void VisitBaseAndDerivedRoot([[maybe_unused]] Root type, ObjectSlot base, ObjectSlot derived, 69 uintptr_t baseOldObject) override; 70 private: 71 void MarkObject(TaggedObject *object); 72 73 SharedGCMovableMarker *marker_ {nullptr}; 74 uint32_t threadId_ {-1}; 75 }; 76 77 class SharedFullGCMarkObjectVisitor final : public EcmaObjectRangeVisitor<SharedFullGCMarkObjectVisitor> { 78 public: 79 explicit SharedFullGCMarkObjectVisitor(SharedGCMovableMarker *marker, uint32_t threadId); 80 ~SharedFullGCMarkObjectVisitor() override = default; 81 82 void VisitObjectRangeImpl(TaggedObject *root, ObjectSlot start, ObjectSlot end, VisitObjectArea area) override; 83 84 void VisitObjectHClassImpl(TaggedObject *hclass) override; 85 private: 86 void HandleSlot(ObjectSlot slot, Region *rootRegion, bool rootNeedEvacuate); 87 88 void MarkAndPush(TaggedObject *object, Region *objectRegion); 89 90 SharedGCMovableMarker *marker_ {nullptr}; 91 uint32_t threadId_ {-1}; 92 }; 93 } // namespace panda::ecmascript 94 95 #endif // ECMASCRIPT_MEM_SHARED_HEAP_SHARED_FULL_GC_H 96