[lsan] Iterate MemoryMappingLayout once

Iterating many time can be very expensive.
This commit is contained in:
Vitaly Buka 2023-05-28 23:01:45 -07:00
parent f8b5ac34ad
commit 19b7b93da9

View File

@ -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) {