diff options
Diffstat (limited to 'src/allocators/mimalloc.zig')
-rw-r--r-- | src/allocators/mimalloc.zig | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/allocators/mimalloc.zig b/src/allocators/mimalloc.zig index 5d8d7f2e3..fbefe6c95 100644 --- a/src/allocators/mimalloc.zig +++ b/src/allocators/mimalloc.zig @@ -14,11 +14,11 @@ pub extern fn mi_reallocn(p: ?*anyopaque, count: usize, size: usize) ?*anyopaque pub extern fn mi_reallocf(p: ?*anyopaque, newsize: usize) ?*anyopaque; pub extern fn mi_usable_size(p: ?*const anyopaque) usize; pub extern fn mi_good_size(size: usize) usize; -pub const mi_deferred_free_fun = fn (bool, c_ulonglong, ?*anyopaque) callconv(.C) void; +pub const mi_deferred_free_fun = *const fn (bool, c_ulonglong, ?*anyopaque) callconv(.C) void; pub extern fn mi_register_deferred_free(deferred_free: ?mi_deferred_free_fun, arg: ?*anyopaque) void; -pub const mi_output_fun = fn ([*:0]const u8, ?*anyopaque) callconv(.C) void; +pub const mi_output_fun = *const fn ([*:0]const u8, ?*anyopaque) callconv(.C) void; pub extern fn mi_register_output(out: ?mi_output_fun, arg: ?*anyopaque) void; -pub const mi_error_fun = fn (c_int, ?*anyopaque) callconv(.C) void; +pub const mi_error_fun = *const fn (c_int, ?*anyopaque) callconv(.C) void; pub extern fn mi_register_error(fun: ?mi_error_fun, arg: ?*anyopaque) void; pub extern fn mi_collect(force: bool) void; pub extern fn mi_version() c_int; @@ -118,7 +118,7 @@ pub const struct_mi_heap_area_s = extern struct { full_block_size: usize, }; pub const mi_heap_area_t = struct_mi_heap_area_s; -pub const mi_block_visit_fun = fn (?*const Heap, [*c]const mi_heap_area_t, ?*anyopaque, usize, ?*anyopaque) callconv(.C) bool; +pub const mi_block_visit_fun = *const fn (?*const Heap, [*c]const mi_heap_area_t, ?*anyopaque, usize, ?*anyopaque) callconv(.C) bool; pub extern fn mi_heap_visit_blocks(heap: ?*const Heap, visit_all_blocks: bool, visitor: ?mi_block_visit_fun, arg: ?*anyopaque) bool; pub extern fn mi_is_in_heap_region(p: ?*const anyopaque) bool; pub extern fn mi_is_redirected() bool; @@ -201,3 +201,13 @@ pub extern fn mi_new_reallocn(p: ?*anyopaque, newcount: usize, size: usize) ?*an pub const MI_SMALL_WSIZE_MAX = @as(c_int, 128); pub const MI_SMALL_SIZE_MAX = MI_SMALL_WSIZE_MAX * @import("std").zig.c_translation.sizeof(?*anyopaque); pub const MI_ALIGNMENT_MAX = (@as(c_int, 16) * @as(c_int, 1024)) * @as(c_ulong, 1024); + +const std = @import("std"); +pub fn canUseAlignedAlloc(len: usize, alignment: usize) bool { + return alignment > 0 and std.math.isPowerOfTwo(alignment) and !mi_malloc_satisfies_alignment(alignment, len); +} +const MI_MAX_ALIGN_SIZE = 16; +inline fn mi_malloc_satisfies_alignment(alignment: usize, size: usize) bool { + return (alignment == @sizeOf(*anyopaque) or + (alignment == MI_MAX_ALIGN_SIZE and size >= (MI_MAX_ALIGN_SIZE / 2))); +} |