From 56c6f767ae7368a2b2355e002384bf4d5f672132 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 24 Jul 2019 07:24:19 -0400 Subject: kernel/vm_manager: Reserve memory ahead of time for slow path in MergeAdjacentVMA Avoids potentially expensive (depending on the size of the memory block) allocations by reserving the necessary memory before performing both insertions. This avoids scenarios where the second insert may cause a reallocation to occur. --- src/core/hle/kernel/vm_manager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/core/hle/kernel') diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index 721f7cc44..6b2d78cc8 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -765,11 +765,14 @@ void VMManager::MergeAdjacentVMA(VirtualMemoryArea& left, const VirtualMemoryAre // Fast case: left is an entire backing block. left.backing_block->insert(left.backing_block->end(), right_begin, right_end); } else { + // Slow case: make a new memory block for left and right. const auto left_begin = left.backing_block->begin() + left.offset; const auto left_end = left_begin + left.size; + const auto left_size = static_cast(std::distance(left_begin, left_end)); + const auto right_size = static_cast(std::distance(right_begin, right_end)); - // Slow case: make a new memory block for left and right. auto new_memory = std::make_shared(); + new_memory->reserve(left_size + right_size); new_memory->insert(new_memory->end(), left_begin, left_end); new_memory->insert(new_memory->end(), right_begin, right_end); -- cgit v1.2.3