1 /* 2 * Copyright (c) 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 COMMON_COMPONENTS_HEAP_SPACE_FROM_SPACE_H 16 #define COMMON_COMPONENTS_HEAP_SPACE_FROM_SPACE_H 17 18 #include <assert.h> 19 #include <list> 20 #include <map> 21 #include <set> 22 #include <thread> 23 #include <vector> 24 25 #include "common_components/heap/allocator/alloc_util.h" 26 #include "common_components/heap/allocator/allocator.h" 27 #include "common_components/heap/allocator/region_manager.h" 28 #include "common_components/mutator/mutator.h" 29 #include "common_components/heap/allocator/fix_heap.h" 30 #if defined(COMMON_SANITIZER_SUPPORT) 31 #include "common_components/base/asan_interface.h" 32 #endif 33 34 namespace common { 35 class RegionSpace; 36 class OldSpace; 37 class Taskpool; 38 39 // regions for small-sized movable objects, which may be moved during gc. 40 class FromSpace : public RegionalSpace { 41 public: FromSpace(RegionManager & regionManager,RegionSpace & heap)42 FromSpace(RegionManager& regionManager, RegionSpace& heap) : RegionalSpace(regionManager), 43 fromRegionList_("from-regions"), 44 exemptedFromRegionList_("exempted from-regions"), heap_(heap), exemptedRegionThreshold_(0) {} 45 46 void DumpRegionStats() const; 47 AssembleGarbageCandidates(RegionList & list)48 void AssembleGarbageCandidates(RegionList& list) 49 { 50 fromRegionList_.MergeRegionList(list, RegionDesc::RegionType::FROM_REGION); 51 } 52 53 void ExemptFromRegions(); 54 CollectFixTasks(FixHeapTaskList & taskList)55 void CollectFixTasks(FixHeapTaskList &taskList) 56 { 57 FixHeapWorker::CollectFixHeapTasks(taskList, exemptedFromRegionList_, FIX_REGION); 58 } 59 GetUsedUnitCount()60 size_t GetUsedUnitCount() const 61 { 62 return fromRegionList_.GetUnitCount() + exemptedFromRegionList_.GetUnitCount(); 63 } 64 GetAllocatedSize()65 size_t GetAllocatedSize() const 66 { 67 return fromRegionList_.GetAllocatedSize() + exemptedFromRegionList_.GetAllocatedSize(); 68 } 69 GetFromRegionAllocatedSize()70 size_t GetFromRegionAllocatedSize() const 71 { 72 return fromRegionList_.GetAllocatedSize(); 73 } 74 GetFromRegionList()75 RegionList& GetFromRegionList() { return fromRegionList_; } 76 TryDeleteFromRegion(RegionDesc * del,RegionDesc::RegionType oldType,RegionDesc::RegionType newType)77 bool TryDeleteFromRegion(RegionDesc* del, RegionDesc::RegionType oldType, RegionDesc::RegionType newType) 78 { 79 return fromRegionList_.TryDeleteRegion(del, oldType, newType); 80 } 81 DeleteFromRegion(RegionDesc * region)82 void DeleteFromRegion(RegionDesc* region) 83 { 84 fromRegionList_.DeleteRegion(region); 85 } 86 ExemptFromRegion(RegionDesc * region)87 void ExemptFromRegion(RegionDesc* region) 88 { 89 exemptedFromRegionList_.PrependRegion(region, RegionDesc::RegionType::EXEMPTED_FROM_REGION); 90 } 91 GetSurvivedSize()92 size_t GetSurvivedSize() const 93 { 94 return exemptedFromRegionList_.GetAllocatedSize(); 95 } 96 GetHeap()97 RegionSpace& GetHeap() { return heap_; } 98 99 void ParallelCopyFromRegions(RegionDesc* startRegion, size_t regionCnt); 100 void CopyFromRegions(Taskpool* threadPool); 101 void CopyFromRegions(); 102 103 void GetPromotedTo(OldSpace& mspace); 104 SetExemptedRegionThreshold(double threshold)105 void SetExemptedRegionThreshold(double threshold) 106 { 107 exemptedRegionThreshold_ = threshold; 108 } 109 ClearAllGCInfo()110 void ClearAllGCInfo() 111 { 112 ClearGCInfo(exemptedFromRegionList_); 113 RegionDesc* region = fromRegionList_.GetHeadRegion(); 114 while (region != nullptr) { 115 region->ClearRSet(); 116 region = region->GetNextRegion(); 117 } 118 } 119 GetExemptedRegionList()120 RegionList& GetExemptedRegionList() noexcept { return exemptedFromRegionList_; } 121 122 private: ClearGCInfo(RegionList & list)123 void ClearGCInfo(RegionList& list) 124 { 125 RegionList tmp("temp region list"); 126 list.CopyListTo(tmp); 127 tmp.VisitAllRegions([](RegionDesc* region) { 128 region->ClearMarkingCopyLine(); 129 region->ClearLiveInfo(); 130 region->ResetMarkBit(); 131 }); 132 } 133 // fromRegionList is a list of full regions waiting to be collected (i.e. for forwarding). 134 // region type must be FROM_REGION. 135 RegionList fromRegionList_; 136 137 // regions exempted by ExemptFromRegions, which will not be moved during current GC. 138 RegionList exemptedFromRegionList_; 139 140 RegionSpace& heap_; 141 142 double exemptedRegionThreshold_; 143 }; 144 } // namespace common 145 #endif // COMMON_COMPONENTS_HEAP_SPACE_FROM_SPACE_H 146