From 2066f48b8751dce02f69c4fdba74bd94f6dd2e2c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 14 Nov 2020 18:38:39 +0100 Subject: [PATCH] UserspaceEmulator: Avoid one hash lookup in target_did_malloc() --- DevTools/UserspaceEmulator/MallocTracer.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/DevTools/UserspaceEmulator/MallocTracer.cpp b/DevTools/UserspaceEmulator/MallocTracer.cpp index d3c8517977..83039adf26 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.cpp +++ b/DevTools/UserspaceEmulator/MallocTracer.cpp @@ -64,20 +64,22 @@ void MallocTracer::target_did_malloc(Badge, FlatPtr address, size_t siz if (size <= size_classes[num_size_classes - 1]) { FlatPtr chunked_block_address = address & ChunkedBlock::block_mask; - // FIXME: Don't do a double hash lookup here. + TrackedChunkedBlock* block = nullptr; auto tracked_chunked_block = m_chunked_blocks.get(chunked_block_address); if (!tracked_chunked_block.has_value()) { - m_chunked_blocks.set(chunked_block_address, make()); + auto new_block = make(); + block = new_block.ptr(); + m_chunked_blocks.set(chunked_block_address, move(new_block)); tracked_chunked_block = m_chunked_blocks.get(chunked_block_address); auto& block = const_cast(*tracked_chunked_block.value()); block.address = chunked_block_address; block.chunk_size = mmap_region.read32(offsetof(CommonHeader, m_size)).value(); 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()); + } else { + block = const_cast(tracked_chunked_block.value()); } - ASSERT(tracked_chunked_block.has_value()); - auto& block = const_cast(*tracked_chunked_block.value()); - block.mallocation_for_address(address) = { 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() }); }