• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2023-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_G1_REF_UPDATER_H
16 #define PANDA_RUNTIME_MEM_GC_G1_REF_UPDATER_H
17 
18 #include "runtime/include/object_header.h"
19 #include "runtime/mem/gc/gc_barrier_set.h"
20 #include "runtime/mem/region_allocator.h"
21 #include "runtime/mem/gc/card_table-inl.h"
22 
23 namespace ark::mem {
24 
25 template <class LanguageConfig>
26 class BaseRefUpdater {
27 public:
operator()28     bool operator()(ObjectHeader *object, ObjectHeader *ref, uint32_t offset,
29                     [[maybe_unused]] bool isVolatile = false) const
30     {
31         auto *forwarded = UpdateRefToMovedObject(object, ref, offset);
32         Process(object, offset, forwarded);
33         return true;
34     }
35 
36     DEFAULT_COPY_SEMANTIC(BaseRefUpdater);
37     DEFAULT_MOVE_SEMANTIC(BaseRefUpdater);
38     virtual ~BaseRefUpdater() = default;
39 
40 protected:
BaseRefUpdater(uint32_t regionSizeBits)41     explicit BaseRefUpdater(uint32_t regionSizeBits) : regionSizeBits_(regionSizeBits) {}
42 
43     virtual void Process(ObjectHeader *object, size_t offset, ObjectHeader *ref) const = 0;
44 
IsSameRegion(ObjectHeader * o1,ObjectHeader * o2)45     bool IsSameRegion(ObjectHeader *o1, ObjectHeader *o2) const
46     {
47         return ark::mem::IsSameRegion(o1, o2, regionSizeBits_);
48     }
49 
50 private:
51     ObjectHeader *UpdateRefToMovedObject(ObjectHeader *object, ObjectHeader *ref, uint32_t offset) const;
52 
53     uint32_t regionSizeBits_;
54 };
55 
56 template <class LanguageConfig, bool NEED_LOCK = false>
57 class UpdateRemsetRefUpdater : public BaseRefUpdater<LanguageConfig> {
58 public:
UpdateRemsetRefUpdater(uint32_t regionSizeBits)59     explicit UpdateRemsetRefUpdater(uint32_t regionSizeBits) : BaseRefUpdater<LanguageConfig>(regionSizeBits) {}
60 
61 protected:
62     void Process(ObjectHeader *object, size_t offset, ObjectHeader *ref) const override;
63 };
64 
65 template <class LanguageConfig>
66 class EnqueueRemsetRefUpdater : public BaseRefUpdater<LanguageConfig> {
67 public:
EnqueueRemsetRefUpdater(CardTable * cardTable,GCG1BarrierSet::ThreadLocalCardQueues * updatedRefsQueue,uint32_t regionSizeBits)68     EnqueueRemsetRefUpdater(CardTable *cardTable, GCG1BarrierSet::ThreadLocalCardQueues *updatedRefsQueue,
69                             uint32_t regionSizeBits)
70         : BaseRefUpdater<LanguageConfig>(regionSizeBits), cardTable_(cardTable), updatedRefsQueue_(updatedRefsQueue)
71     {
72     }
73 
74 protected:
Process(ObjectHeader * object,size_t offset,ObjectHeader * ref)75     void Process(ObjectHeader *object, size_t offset, ObjectHeader *ref) const override
76     {
77         if (!this->IsSameRegion(object, ref)) {
78             auto *card = cardTable_->GetCardPtr(ToUintPtr(object) + offset);
79             auto cardStatus = card->GetStatus();
80             if (!CardTable::Card::IsYoung(cardStatus) && !CardTable::Card::IsMarked(cardStatus)) {
81                 card->Mark();
82                 updatedRefsQueue_->push_back(card);
83             }
84         }
85     }
86 
87 private:
88     CardTable *cardTable_;
89     GCG1BarrierSet::ThreadLocalCardQueues *updatedRefsQueue_;
90 };
91 }  // namespace ark::mem
92 
93 #endif
94