1 /** 2 * Copyright (c) 2021-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 #ifndef PANDA_RUNTIME_MEM_GC_LANG_GC_LANG_H 16 #define PANDA_RUNTIME_MEM_GC_LANG_GC_LANG_H 17 18 #include "runtime/mem/gc/gc.h" 19 20 namespace ark::mem { 21 22 // GCLang class is an interlayer between language-agnostic GC class and different implementations of GC. 23 // It contains language-specific methods that are used in several types of GC (such as StwGC, GenGC, etc.) 24 // 25 // GC 26 // ^ 27 // | 28 // GCLang<SpecificLanguage> 29 // ^ ^ ... ^ 30 // | | ... | 31 // / | ... 32 // / | ... 33 // StwGC<SpecificLanguage> GenGC<SpecificLanguage> ... 34 35 template <class LanguageConfig> 36 class GCLang : public GC { 37 public: 38 explicit GCLang(ObjectAllocatorBase *objectAllocator, const GCSettings &settings); 39 NO_COPY_SEMANTIC(GCLang); 40 NO_MOVE_SEMANTIC(GCLang); SetPandaVM(PandaVM * vm)41 void SetPandaVM(PandaVM *vm) override 42 { 43 rootManager_.SetPandaVM(vm); 44 GC::SetPandaVM(vm); 45 } 46 47 bool IsMutatorAllowed() override; 48 49 protected: 50 ~GCLang() override; 51 void UpdateRefsToMovedObjectsInPygoteSpace() override; 52 void CommonUpdateRefsToMovedObjects() override; 53 VisitRoots(const GCRootVisitor & gcRootVisitor,VisitGCRootFlags flags)54 void VisitRoots(const GCRootVisitor &gcRootVisitor, VisitGCRootFlags flags) override 55 { 56 trace::ScopedTrace scopedTrace(__FUNCTION__); 57 rootManager_.VisitNonHeapRoots(gcRootVisitor, flags); 58 } 59 VisitClassRoots(const GCRootVisitor & gcRootVisitor)60 void VisitClassRoots(const GCRootVisitor &gcRootVisitor) override 61 { 62 trace::ScopedTrace scopedTrace(__FUNCTION__); 63 rootManager_.VisitClassRoots(gcRootVisitor); 64 } 65 VisitCardTableRoots(CardTable * cardTable,const GCRootVisitor & gcRootVisitor,const MemRangeChecker & rangeChecker,const ObjectChecker & rangeObjectChecker,const ObjectChecker & fromObjectChecker,uint32_t processedFlag)66 void VisitCardTableRoots(CardTable *cardTable, const GCRootVisitor &gcRootVisitor, 67 const MemRangeChecker &rangeChecker, const ObjectChecker &rangeObjectChecker, 68 const ObjectChecker &fromObjectChecker, uint32_t processedFlag) override 69 { 70 rootManager_.VisitCardTableRoots(cardTable, GetObjectAllocator(), gcRootVisitor, rangeChecker, 71 rangeObjectChecker, fromObjectChecker, processedFlag); 72 } 73 74 void PreRunPhasesImpl() override; 75 76 size_t VerifyHeap() override; 77 78 private: UpdateVmRefs()79 void UpdateVmRefs() override 80 { 81 rootManager_.UpdateVmRefs(); 82 } 83 UpdateGlobalObjectStorage()84 void UpdateGlobalObjectStorage() override 85 { 86 rootManager_.UpdateGlobalObjectStorage(); 87 } 88 UpdateClassLinkerContextRoots()89 void UpdateClassLinkerContextRoots() override 90 { 91 rootManager_.UpdateClassLinkerContextRoots(); 92 } 93 UpdateThreadLocals()94 void UpdateThreadLocals() override 95 { 96 rootManager_.UpdateThreadLocals(); 97 } 98 99 void ClearLocalInternalAllocatorPools() override; 100 101 RootManager<LanguageConfig> rootManager_ {}; 102 friend class RootManager<LanguageConfig>; 103 }; 104 105 } // namespace ark::mem 106 107 #endif // PANDA_RUNTIME_MEM_GC_LANG_GC_LANG_H 108