1 /** 2 * Copyright (c) 2021-2025 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_CACHE_BUILDER_H 16 #define PANDA_RUNTIME_MEM_GC_G1_REF_CACHE_BUILDER_H 17 18 #include "runtime/mem/gc/g1/g1-gc.h" 19 20 namespace ark::mem { 21 /** 22 * Gets reference fields from an object and puts it to the ref collection. 23 * The ref collection has limited size. If there is no room in the ref collection 24 * the whole object is put to the object collection. 25 */ 26 template <class LanguageConfig, bool FAST_GC = false> 27 class RefCacheBuilder { 28 using RefVector = typename G1GC<LanguageConfig>::RefVector; 29 30 public: RefCacheBuilder(G1GC<LanguageConfig> * gc,PandaList<RefVector * > * refs,size_t regionSizeBits,GCMarkingStackType * objectsStack)31 RefCacheBuilder(G1GC<LanguageConfig> *gc, PandaList<RefVector *> *refs, size_t regionSizeBits, 32 GCMarkingStackType *objectsStack) 33 : gc_(gc), refs_(refs), regionSizeBits_(regionSizeBits), objectsStack_(objectsStack) 34 { 35 } 36 operator()37 bool operator()(ObjectHeader *object, ObjectHeader *field, uint32_t offset, [[maybe_unused]] bool isVolatile) 38 { 39 if (!gc_->InGCSweepRange(field)) { 40 allCrossRegionRefsProcessed_ &= ark::mem::IsSameRegion(object, field, regionSizeBits_); 41 return true; 42 } 43 RefVector *refVector = refs_->back(); 44 if (refVector->size() == refVector->capacity()) { 45 // There is no room to store references. 46 // Create a new vector and store everithing inside it 47 auto *newRefVector = gc_->GetInternalAllocator()->template New<RefVector>(); 48 ASSERT(newRefVector != nullptr); 49 newRefVector->reserve(refVector->capacity() * 2U); 50 refs_->push_back(newRefVector); 51 refVector = newRefVector; 52 } 53 ASSERT(refVector->size() < refVector->capacity()); 54 if constexpr (!FAST_GC) { 55 // There is room to store references 56 ASSERT(objectsStack_ != nullptr); 57 if (gc_->mixedMarker_.MarkIfNotMarkedInCollectionSet(field)) { 58 objectsStack_->PushToStack(object, field); 59 } 60 } 61 refVector->emplace_back(object, offset); 62 return true; 63 } 64 AllCrossRegionRefsProcessed()65 bool AllCrossRegionRefsProcessed() const 66 { 67 return allCrossRegionRefsProcessed_; 68 } 69 70 private: 71 G1GC<LanguageConfig> *gc_; 72 PandaList<RefVector *> *refs_; 73 bool allCrossRegionRefsProcessed_ = true; 74 size_t regionSizeBits_; 75 // object stack pointer which will be used to store unmarked objects if it is not nullptr 76 GCMarkingStackType *objectsStack_ = nullptr; 77 }; 78 } // namespace ark::mem 79 #endif // PANDA_RUNTIME_MEM_GC_G1_REF_CACHE_BUILDER_H 80