Skip to content

Commit

Permalink
Revert to unoptimized behavior on Darwin
Browse files Browse the repository at this point in the history
  • Loading branch information
Feoramund committed Feb 10, 2025
1 parent e4f413c commit 219755c
Showing 1 changed file with 7 additions and 36 deletions.
43 changes: 7 additions & 36 deletions base/runtime/virtual_memory_darwin.odin
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 219755c

Please sign in to comment.