• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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