1 /** 2 * Copyright (c) 2021-2022 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 panda::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 *object_allocator, const GCSettings &settings); 39 NO_COPY_SEMANTIC(GCLang); 40 NO_MOVE_SEMANTIC(GCLang); SetPandaVM(PandaVM * vm)41 void SetPandaVM(PandaVM *vm) override 42 { 43 root_manager_.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 & gc_root_visitor,VisitGCRootFlags flags)54 void VisitRoots(const GCRootVisitor &gc_root_visitor, VisitGCRootFlags flags) override 55 { 56 trace::ScopedTrace scoped_trace(__FUNCTION__); 57 root_manager_.VisitNonHeapRoots(gc_root_visitor, flags); 58 } 59 VisitClassRoots(const GCRootVisitor & gc_root_visitor)60 void VisitClassRoots(const GCRootVisitor &gc_root_visitor) override 61 { 62 trace::ScopedTrace scoped_trace(__FUNCTION__); 63 root_manager_.VisitClassRoots(gc_root_visitor); 64 } 65 VisitCardTableRoots(CardTable * card_table,const GCRootVisitor & gc_root_visitor,const MemRangeChecker & range_checker,const ObjectChecker & range_object_checker,const ObjectChecker & from_object_checker,uint32_t processed_flag)66 void VisitCardTableRoots(CardTable *card_table, const GCRootVisitor &gc_root_visitor, 67 const MemRangeChecker &range_checker, const ObjectChecker &range_object_checker, 68 const ObjectChecker &from_object_checker, uint32_t processed_flag) override 69 { 70 root_manager_.VisitCardTableRoots(card_table, GetObjectAllocator(), gc_root_visitor, range_checker, 71 range_object_checker, from_object_checker, processed_flag); 72 } 73 74 void PreRunPhasesImpl() override; 75 76 private: UpdateVmRefs()77 void UpdateVmRefs() override 78 { 79 root_manager_.UpdateVmRefs(); 80 } 81 UpdateGlobalObjectStorage()82 void UpdateGlobalObjectStorage() override 83 { 84 root_manager_.UpdateGlobalObjectStorage(); 85 } 86 UpdateClassLinkerContextRoots()87 void UpdateClassLinkerContextRoots() override 88 { 89 root_manager_.UpdateClassLinkerContextRoots(); 90 } 91 UpdateThreadLocals()92 void UpdateThreadLocals() override 93 { 94 root_manager_.UpdateThreadLocals(); 95 } 96 97 void ClearLocalInternalAllocatorPools() override; 98 99 size_t VerifyHeap() override; 100 101 RootManager<LanguageConfig> root_manager_ {}; 102 friend class RootManager<LanguageConfig>; 103 }; 104 105 } // namespace panda::mem 106 107 #endif // PANDA_RUNTIME_MEM_GC_LANG_GC_LANG_H 108