From d88b36448b46f97646438e5a54e6ce07e35b5f38 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 14 Nov 2020 18:36:17 +0100 Subject: [PATCH] UserspaceEmulator: Add some helpers to tidy up TrackedChunkedBlock --- DevTools/UserspaceEmulator/MallocTracer.cpp | 24 +++++++++++++-------- DevTools/UserspaceEmulator/MallocTracer.h | 3 +++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/DevTools/UserspaceEmulator/MallocTracer.cpp b/DevTools/UserspaceEmulator/MallocTracer.cpp index 440d85b7b6..d3c8517977 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.cpp +++ b/DevTools/UserspaceEmulator/MallocTracer.cpp @@ -72,20 +72,28 @@ void MallocTracer::target_did_malloc(Badge, FlatPtr address, size_t siz auto& block = const_cast(*tracked_chunked_block.value()); block.address = chunked_block_address; block.chunk_size = mmap_region.read32(offsetof(CommonHeader, m_size)).value(); - auto chunk_count = (ChunkedBlock::block_size - sizeof(ChunkedBlock)) / block.chunk_size; - block.mallocations.resize(chunk_count); - dbgln("Tracking ChunkedBlock @ {:p} with chunk_size={}, chunk_count={}", block.address, block.chunk_size, chunk_count); + block.mallocations.resize((ChunkedBlock::block_size - sizeof(ChunkedBlock)) / block.chunk_size); + dbgln("Tracking ChunkedBlock @ {:p} with chunk_size={}, chunk_count={}", block.address, block.chunk_size, block.mallocations.size()); } ASSERT(tracked_chunked_block.has_value()); auto& block = const_cast(*tracked_chunked_block.value()); - auto chunk_offset = address - (block.address + sizeof(ChunkedBlock)); - auto chunk_index = chunk_offset / block.chunk_size; - block.mallocations[chunk_index] = { address, size, true, false, Emulator::the().raw_backtrace(), Vector() }; + block.mallocation_for_address(address) = { address, size, true, false, Emulator::the().raw_backtrace(), Vector() }; } else { m_big_mallocations.append({ address, size, true, false, Emulator::the().raw_backtrace(), Vector() }); } } +ALWAYS_INLINE MallocTracer::Mallocation& MallocTracer::TrackedChunkedBlock::mallocation_for_address(FlatPtr address) const +{ + return const_cast(this->mallocations[chunk_index_for_address(address)]); +} + +ALWAYS_INLINE size_t MallocTracer::TrackedChunkedBlock::chunk_index_for_address(FlatPtr address) const +{ + auto chunk_offset = address - (this->address + sizeof(ChunkedBlock)); + return chunk_offset / this->chunk_size; +} + void MallocTracer::target_did_free(Badge, FlatPtr address) { if (!address) @@ -143,9 +151,7 @@ MallocTracer::Mallocation* MallocTracer::find_mallocation(FlatPtr address) auto chunked_block = m_chunked_blocks.get(possible_chunked_block); if (chunked_block.has_value()) { auto& block = *chunked_block.value(); - auto chunk_offset = address - (block.address + sizeof(ChunkedBlock)); - auto chunk_index = chunk_offset / block.chunk_size; - auto& mallocation = block.mallocations[chunk_index]; + auto& mallocation = block.mallocation_for_address(address); if (mallocation.used) { ASSERT(mallocation.contains(address)); return const_cast(&mallocation); diff --git a/DevTools/UserspaceEmulator/MallocTracer.h b/DevTools/UserspaceEmulator/MallocTracer.h index 4a90405fe6..aad1d66adb 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.h +++ b/DevTools/UserspaceEmulator/MallocTracer.h @@ -69,6 +69,9 @@ private: FlatPtr address { 0 }; size_t chunk_size { 0 }; + size_t chunk_index_for_address(FlatPtr) const; + Mallocation& mallocation_for_address(FlatPtr) const; + Vector mallocations; };