aboutsummaryrefslogtreecommitdiff
path: root/src/allocators/mimalloc.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/allocators/mimalloc.zig')
-rw-r--r--src/allocators/mimalloc.zig18
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)));
+}