[lsan] Iterate MemoryMappingLayout once
Iterating many time can be very expensive.
This commit is contained in:
parent
f8b5ac34ad
commit
19b7b93da9
@ -243,10 +243,6 @@ static LeakSuppressionContext *GetSuppressionContext() {
|
|||||||
|
|
||||||
static InternalMmapVectorNoCtor<Region> root_regions;
|
static InternalMmapVectorNoCtor<Region> root_regions;
|
||||||
|
|
||||||
InternalMmapVectorNoCtor<Region> const *GetRootRegions() {
|
|
||||||
return &root_regions;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitCommonLsan() {
|
void InitCommonLsan() {
|
||||||
if (common_flags()->detect_leaks) {
|
if (common_flags()->detect_leaks) {
|
||||||
// Initialization which can fail or print warnings should only be done if
|
// Initialization which can fail or print warnings should only be done if
|
||||||
@ -555,21 +551,17 @@ void ScanRootRegions(Frontier *frontier,
|
|||||||
ScanRootRegion(frontier, r, m.begin, m.end, true);
|
ScanRootRegion(frontier, r, m.begin, m.end, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ProcessRootRegion(Frontier *frontier, const Region &root_region) {
|
|
||||||
MemoryMappingLayout proc_maps(/*cache_enabled*/ true);
|
|
||||||
MemoryMappedSegment segment;
|
|
||||||
while (proc_maps.Next(&segment)) {
|
|
||||||
ScanRootRegion(frontier, root_region, segment.start, segment.end,
|
|
||||||
segment.IsReadable());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scans root regions for heap pointers.
|
// Scans root regions for heap pointers.
|
||||||
static void ProcessRootRegions(Frontier *frontier) {
|
static void ProcessRootRegions(Frontier *frontier) {
|
||||||
if (!flags()->use_root_regions)
|
if (!flags()->use_root_regions || !HasRootRegions())
|
||||||
return;
|
return;
|
||||||
for (uptr i = 0; i < root_regions.size(); i++)
|
MemoryMappingLayout proc_maps(/*cache_enabled*/ true);
|
||||||
ProcessRootRegion(frontier, root_regions[i]);
|
MemoryMappedSegment segment;
|
||||||
|
InternalMmapVectorNoCtor<Region> mapped_regions;
|
||||||
|
while (proc_maps.Next(&segment))
|
||||||
|
if (segment.IsReadable())
|
||||||
|
mapped_regions.push_back({segment.start, segment.end});
|
||||||
|
ScanRootRegions(frontier, mapped_regions);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FloodFillTag(Frontier *frontier, ChunkTag tag) {
|
static void FloodFillTag(Frontier *frontier, ChunkTag tag) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user