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