diff --git a/DevTools/UserspaceEmulator/MallocTracer.cpp b/DevTools/UserspaceEmulator/MallocTracer.cpp index 67f921268a..3230e6a093 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.cpp +++ b/DevTools/UserspaceEmulator/MallocTracer.cpp @@ -156,14 +156,16 @@ bool MallocTracer::is_reachable(const Mallocation& mallocation) const } } + bool reachable = false; + // 2. Search in other memory regions for pointers to this mallocation - for (auto& region : Emulator::the().mmu().regions()) { + Emulator::the().mmu().for_each_region([&](auto& region) { // Skip the stack if (region.is_stack()) - continue; + return IterationDecision::Continue; // Skip malloc blocks if (region.is_mmap() && static_cast(region).is_malloc_block()) - continue; + return IterationDecision::Continue; size_t pointers_in_region = region.size() / sizeof(u32); for (size_t i = 0; i < pointers_in_region; ++i) { @@ -172,12 +174,13 @@ bool MallocTracer::is_reachable(const Mallocation& mallocation) const #ifdef REACHABLE_DEBUG dbgprintf("mallocation %p is reachable from region %p-%p\n", mallocation.address, region.base(), region.end() - 1); #endif - return true; + reachable = true; + return IterationDecision::Break; } } - } - - return false; + return IterationDecision::Continue; + }); + return reachable; } void MallocTracer::dump_leak_report() diff --git a/DevTools/UserspaceEmulator/SoftMMU.h b/DevTools/UserspaceEmulator/SoftMMU.h index a79e939fea..d73eff7165 100644 --- a/DevTools/UserspaceEmulator/SoftMMU.h +++ b/DevTools/UserspaceEmulator/SoftMMU.h @@ -98,7 +98,18 @@ public: SharedBufferRegion* shbuf_region(int shbuf_id); - NonnullOwnPtrVector& regions() { return m_regions; } + template + void for_each_region(Callback callback) + { + if (m_tls_region) { + if (callback(*m_tls_region) == IterationDecision::Break) + return; + } + for (auto& region : m_regions) { + if (callback(region) == IterationDecision::Break) + return; + } + } private: OwnPtr m_tls_region;