• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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