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