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