mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-11-01 04:47:53 +00:00
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.
This commit is contained in:
parent
70485e690b
commit
785c4946dd
1 changed files with 10 additions and 7 deletions
|
@ -757,19 +757,22 @@ void VMManager::MergeAdjacentVMA(VirtualMemoryArea& left, const VirtualMemoryAre
|
||||||
// Always merge allocated memory blocks, even when they don't share the same backing block.
|
// Always merge allocated memory blocks, even when they don't share the same backing block.
|
||||||
if (left.type == VMAType::AllocatedMemoryBlock &&
|
if (left.type == VMAType::AllocatedMemoryBlock &&
|
||||||
(left.backing_block != right.backing_block || left.offset + left.size != right.offset)) {
|
(left.backing_block != right.backing_block || left.offset + left.size != right.offset)) {
|
||||||
|
const auto right_begin = right.backing_block->begin() + right.offset;
|
||||||
|
const auto right_end = right_begin + right.size;
|
||||||
|
|
||||||
// Check if we can save work.
|
// Check if we can save work.
|
||||||
if (left.offset == 0 && left.size == left.backing_block->size()) {
|
if (left.offset == 0 && left.size == left.backing_block->size()) {
|
||||||
// Fast case: left is an entire backing block.
|
// Fast case: left is an entire backing block.
|
||||||
left.backing_block->insert(left.backing_block->end(),
|
left.backing_block->insert(left.backing_block->end(), right_begin, right_end);
|
||||||
right.backing_block->begin() + right.offset,
|
|
||||||
right.backing_block->begin() + right.offset + right.size);
|
|
||||||
} else {
|
} else {
|
||||||
|
const auto left_begin = left.backing_block->begin() + left.offset;
|
||||||
|
const auto left_end = left_begin + left.size;
|
||||||
|
|
||||||
// Slow case: make a new memory block for left and right.
|
// Slow case: make a new memory block for left and right.
|
||||||
auto new_memory = std::make_shared<PhysicalMemory>();
|
auto new_memory = std::make_shared<PhysicalMemory>();
|
||||||
new_memory->insert(new_memory->end(), left.backing_block->begin() + left.offset,
|
new_memory->insert(new_memory->end(), left_begin, left_end);
|
||||||
left.backing_block->begin() + left.offset + left.size);
|
new_memory->insert(new_memory->end(), right_begin, right_end);
|
||||||
new_memory->insert(new_memory->end(), right.backing_block->begin() + right.offset,
|
|
||||||
right.backing_block->begin() + right.offset + right.size);
|
|
||||||
left.backing_block = new_memory;
|
left.backing_block = new_memory;
|
||||||
left.offset = 0;
|
left.offset = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue