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_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> 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 newRefVector->reserve(refVector->capacity() * 2U); 49 refs_->push_back(newRefVector); 50 refVector = newRefVector; 51 } 52 ASSERT(refVector->size() < refVector->capacity()); 53 // There is room to store references 54 ASSERT(objectsStack_ != nullptr); 55 if (gc_->mixedMarker_.MarkIfNotMarkedInCollectionSet(field)) { 56 objectsStack_->PushToStack(object, field); 57 } 58 refVector->emplace_back(object, offset); 59 return true; 60 } 61 AllCrossRegionRefsProcessed()62 bool AllCrossRegionRefsProcessed() const 63 { 64 return allCrossRegionRefsProcessed_; 65 } 66 67 private: 68 G1GC<LanguageConfig> *gc_; 69 PandaList<RefVector *> *refs_; 70 bool allCrossRegionRefsProcessed_ = true; 71 size_t regionSizeBits_; 72 // object stack pointer which will be used to store unmarked objects if it is not nullptr 73 GCMarkingStackType *objectsStack_ = nullptr; 74 }; 75 } // namespace ark::mem 76 #endif // PANDA_RUNTIME_MEM_GC_G1_REF_CACHE_BUILDER_H 77