diff --git a/base/runtime/virtual_memory_darwin.odin b/base/runtime/virtual_memory_darwin.odin index 548b5ff04..77b46dc82 100644 --- a/base/runtime/virtual_memory_darwin.odin +++ b/base/runtime/virtual_memory_darwin.odin @@ -100,42 +100,13 @@ _free_virtual_memory :: proc "contextless" (ptr: rawptr, size: int) { } _resize_virtual_memory :: proc "contextless" (ptr: rawptr, old_size: int, new_size: int, alignment: int) -> rawptr { - old_size_pages := old_size / PAGE_SIZE - new_size_pages := new_size / PAGE_SIZE - if old_size % PAGE_SIZE != 0 { - old_size_pages += 1 - } - if new_size % PAGE_SIZE != 0 { - new_size_pages += 1 - } - - if new_size_pages == old_size_pages { - return ptr - } else if new_size_pages > old_size_pages { - new_address: u64 - result_alloc := mach_vm_allocate(mach_task_self_, &new_address, u64(new_size), VM_FLAGS_ANYWHERE) - if result_alloc != 0 { - return nil - } - - alignment_mask: u64 - if alignment != 0 { - alignment_mask = u64(alignment) - 1 - } - - mach_vm_protect(mach_task_self_, new_address, u64(new_size), true, VM_PROT_READ|VM_PROT_WRITE) - mach_vm_protect(mach_task_self_, new_address, u64(new_size), false, VM_PROT_READ|VM_PROT_WRITE) - cur_protection, max_protection: i32 - result_remap := mach_vm_remap(mach_task_self_, &new_address, u64(old_size), alignment_mask, VM_FLAGS_ANYWHERE, mach_task_self_, u64(uintptr(ptr)), true, &cur_protection, &max_protection, VM_INHERIT_COPY) - if result_remap != 0 { - return nil - } - mach_vm_deallocate(mach_task_self_, u64(uintptr(ptr)), u64(old_size)) - return rawptr(uintptr(new_address)) + result: rawptr = --- + if alignment == 0 { + result = _allocate_virtual_memory(new_size) } else { - new_size_boundary := new_size_pages * PAGE_SIZE - shrink_by := u64(old_size - new_size) - mach_vm_deallocate(mach_task_self_, u64(uintptr(ptr) + uintptr(new_size_boundary)), shrink_by) - return rawptr(uintptr(ptr)) + result = _allocate_virtual_memory_aligned(new_size, alignment) } + intrinsics.mem_copy_non_overlapping(result, ptr, min(new_size, old_size)) + mach_vm_deallocate(mach_task_self_, u64(uintptr(ptr)), u64(old_size)) + return result }