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