summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2019-07-24 07:14:47 -0400
committerGravatar Lioncash2019-08-29 19:28:57 -0400
commit785c4946ddf79c0c4454c003baa20cab6ebb63ca (patch)
treedddd0b62fd968b39b84ae72892e18ab4b214aa5a
parentkernel/vm_manager: Simplify some std::vector constructor calls (diff)
downloadyuzu-785c4946ddf79c0c4454c003baa20cab6ebb63ca.tar.gz
yuzu-785c4946ddf79c0c4454c003baa20cab6ebb63ca.tar.xz
yuzu-785c4946ddf79c0c4454c003baa20cab6ebb63ca.zip
kernel/vm_manager: Deduplicate iterator creation in MergeAdjacentVMA
Avoids needing to read the same long sequence of code in both code paths. Also makes it slightly nicer to read and debug, as the locals will be able to be shown in the debugger.
-rw-r--r--src/core/hle/kernel/vm_manager.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index 231e42baa..e86796ba5 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -757,19 +757,22 @@ void VMManager::MergeAdjacentVMA(VirtualMemoryArea& left, const VirtualMemoryAre
757 // Always merge allocated memory blocks, even when they don't share the same backing block. 757 // Always merge allocated memory blocks, even when they don't share the same backing block.
758 if (left.type == VMAType::AllocatedMemoryBlock && 758 if (left.type == VMAType::AllocatedMemoryBlock &&
759 (left.backing_block != right.backing_block || left.offset + left.size != right.offset)) { 759 (left.backing_block != right.backing_block || left.offset + left.size != right.offset)) {
760 const auto right_begin = right.backing_block->begin() + right.offset;
761 const auto right_end = right_begin + right.size;
762
760 // Check if we can save work. 763 // Check if we can save work.
761 if (left.offset == 0 && left.size == left.backing_block->size()) { 764 if (left.offset == 0 && left.size == left.backing_block->size()) {
762 // Fast case: left is an entire backing block. 765 // Fast case: left is an entire backing block.
763 left.backing_block->insert(left.backing_block->end(), 766 left.backing_block->insert(left.backing_block->end(), right_begin, right_end);
764 right.backing_block->begin() + right.offset,
765 right.backing_block->begin() + right.offset + right.size);
766 } else { 767 } else {
768 const auto left_begin = left.backing_block->begin() + left.offset;
769 const auto left_end = left_begin + left.size;
770
767 // Slow case: make a new memory block for left and right. 771 // Slow case: make a new memory block for left and right.
768 auto new_memory = std::make_shared<PhysicalMemory>(); 772 auto new_memory = std::make_shared<PhysicalMemory>();
769 new_memory->insert(new_memory->end(), left.backing_block->begin() + left.offset, 773 new_memory->insert(new_memory->end(), left_begin, left_end);
770 left.backing_block->begin() + left.offset + left.size); 774 new_memory->insert(new_memory->end(), right_begin, right_end);
771 new_memory->insert(new_memory->end(), right.backing_block->begin() + right.offset, 775
772 right.backing_block->begin() + right.offset + right.size);
773 left.backing_block = new_memory; 776 left.backing_block = new_memory;
774 left.offset = 0; 777 left.offset = 0;
775 } 778 }