summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Lioncash2019-07-24 07:24:19 -0400
committerGravatar Lioncash2019-08-29 19:29:43 -0400
commit56c6f767ae7368a2b2355e002384bf4d5f672132 (patch)
treeb943949eaf77425109202f00aa365814b455c0ad /src/core
parentkernel/vm_manager: std::move shared_ptr instance in MergeAdjacentVMA (diff)
downloadyuzu-56c6f767ae7368a2b2355e002384bf4d5f672132.tar.gz
yuzu-56c6f767ae7368a2b2355e002384bf4d5f672132.tar.xz
yuzu-56c6f767ae7368a2b2355e002384bf4d5f672132.zip
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.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/vm_manager.cpp5
1 files changed, 4 insertions, 1 deletions
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
765 // Fast case: left is an entire backing block. 765 // Fast case: left is an entire backing block.
766 left.backing_block->insert(left.backing_block->end(), right_begin, right_end); 766 left.backing_block->insert(left.backing_block->end(), right_begin, right_end);
767 } else { 767 } else {
768 // Slow case: make a new memory block for left and right.
768 const auto left_begin = left.backing_block->begin() + left.offset; 769 const auto left_begin = left.backing_block->begin() + left.offset;
769 const auto left_end = left_begin + left.size; 770 const auto left_end = left_begin + left.size;
771 const auto left_size = static_cast<std::size_t>(std::distance(left_begin, left_end));
772 const auto right_size = static_cast<std::size_t>(std::distance(right_begin, right_end));
770 773
771 // Slow case: make a new memory block for left and right.
772 auto new_memory = std::make_shared<PhysicalMemory>(); 774 auto new_memory = std::make_shared<PhysicalMemory>();
775 new_memory->reserve(left_size + right_size);
773 new_memory->insert(new_memory->end(), left_begin, left_end); 776 new_memory->insert(new_memory->end(), left_begin, left_end);
774 new_memory->insert(new_memory->end(), right_begin, right_end); 777 new_memory->insert(new_memory->end(), right_begin, right_end);
775 778