Function realloc [src]

Prototype

pub fn realloc(uncasted_memory: []u8, new_len: usize, may_move: bool) ?[*]u8

Parameters

uncasted_memory: []u8new_len: usizemay_move: bool

Source

pub fn realloc(uncasted_memory: []u8, new_len: usize, may_move: bool) ?[*]u8 { const memory: []align(page_size_min) u8 = @alignCast(uncasted_memory); const page_size = std.heap.pageSize(); const new_size_aligned = mem.alignForward(usize, new_len, page_size); if (native_os == .windows) { if (new_len <= memory.len) { const base_addr = @intFromPtr(memory.ptr); const old_addr_end = base_addr + memory.len; const new_addr_end = mem.alignForward(usize, base_addr + new_len, page_size); if (old_addr_end > new_addr_end) { var decommit_addr: ?*anyopaque = @ptrFromInt(new_addr_end); var decommit_size: windows.SIZE_T = old_addr_end - new_addr_end; _ = ntdll.NtAllocateVirtualMemory(windows.GetCurrentProcess(), @ptrCast(&decommit_addr), 0, &decommit_size, windows.MEM_RESET, windows.PAGE_NOACCESS); } return memory.ptr; } const old_size_aligned = mem.alignForward(usize, memory.len, page_size); if (new_size_aligned <= old_size_aligned) { return memory.ptr; } return null; } const page_aligned_len = mem.alignForward(usize, memory.len, page_size); if (new_size_aligned == page_aligned_len) return memory.ptr; if (posix.MREMAP != void) { // TODO: if the next_mmap_addr_hint is within the remapped range, update it const new_memory = posix.mremap(memory.ptr, memory.len, new_len, .{ .MAYMOVE = may_move }, null) catch return null; return new_memory.ptr; } if (new_size_aligned < page_aligned_len) { const ptr = memory.ptr + new_size_aligned; // TODO: if the next_mmap_addr_hint is within the unmapped range, update it posix.munmap(@alignCast(ptr[0 .. page_aligned_len - new_size_aligned])); return memory.ptr; } return null; }