Fix build failure in sbrk allocator, caused by #20511

This commit is contained in:
schtvn 2025-02-17 06:37:19 -08:00 committed by GitHub
parent d7b93c7876
commit 1b62469ec9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 7 deletions

View File

@ -989,6 +989,7 @@ test {
_ = GeneralPurposeAllocator; _ = GeneralPurposeAllocator;
_ = FixedBufferAllocator; _ = FixedBufferAllocator;
_ = ThreadSafeAllocator; _ = ThreadSafeAllocator;
_ = SbrkAllocator;
if (builtin.target.isWasm()) { if (builtin.target.isWasm()) {
_ = WasmAllocator; _ = WasmAllocator;
} }

View File

@ -11,6 +11,7 @@ pub fn SbrkAllocator(comptime sbrk: *const fn (n: usize) usize) type {
pub const vtable: Allocator.VTable = .{ pub const vtable: Allocator.VTable = .{
.alloc = alloc, .alloc = alloc,
.resize = resize, .resize = resize,
.remap = remap,
.free = free, .free = free,
}; };
@ -39,14 +40,13 @@ pub fn SbrkAllocator(comptime sbrk: *const fn (n: usize) usize) type {
// TODO don't do the naive locking strategy // TODO don't do the naive locking strategy
var lock: std.Thread.Mutex = .{}; var lock: std.Thread.Mutex = .{};
fn alloc(ctx: *anyopaque, len: usize, log2_align: u8, return_address: usize) ?[*]u8 { fn alloc(ctx: *anyopaque, len: usize, alignment: mem.Alignment, return_address: usize) ?[*]u8 {
_ = ctx; _ = ctx;
_ = return_address; _ = return_address;
lock.lock(); lock.lock();
defer lock.unlock(); defer lock.unlock();
// Make room for the freelist next pointer. // Make room for the freelist next pointer.
const alignment = @as(usize, 1) << @as(Allocator.Log2Align, @intCast(log2_align)); const actual_len = @max(len +| @sizeOf(usize), alignment.toByteUnits());
const actual_len = @max(len +| @sizeOf(usize), alignment);
const slot_size = math.ceilPowerOfTwo(usize, actual_len) catch return null; const slot_size = math.ceilPowerOfTwo(usize, actual_len) catch return null;
const class = math.log2(slot_size) - min_class; const class = math.log2(slot_size) - min_class;
if (class < size_class_count) { if (class < size_class_count) {
@ -82,7 +82,7 @@ pub fn SbrkAllocator(comptime sbrk: *const fn (n: usize) usize) type {
fn resize( fn resize(
ctx: *anyopaque, ctx: *anyopaque,
buf: []u8, buf: []u8,
log2_buf_align: u8, alignment: mem.Alignment,
new_len: usize, new_len: usize,
return_address: usize, return_address: usize,
) bool { ) bool {
@ -92,7 +92,7 @@ pub fn SbrkAllocator(comptime sbrk: *const fn (n: usize) usize) type {
defer lock.unlock(); defer lock.unlock();
// We don't want to move anything from one size class to another, but we // We don't want to move anything from one size class to another, but we
// can recover bytes in between powers of two. // can recover bytes in between powers of two.
const buf_align = @as(usize, 1) << @as(Allocator.Log2Align, @intCast(log2_buf_align)); const buf_align = alignment.toByteUnits();
const old_actual_len = @max(buf.len + @sizeOf(usize), buf_align); const old_actual_len = @max(buf.len + @sizeOf(usize), buf_align);
const new_actual_len = @max(new_len +| @sizeOf(usize), buf_align); const new_actual_len = @max(new_len +| @sizeOf(usize), buf_align);
const old_small_slot_size = math.ceilPowerOfTwoAssert(usize, old_actual_len); const old_small_slot_size = math.ceilPowerOfTwoAssert(usize, old_actual_len);
@ -109,17 +109,27 @@ pub fn SbrkAllocator(comptime sbrk: *const fn (n: usize) usize) type {
} }
} }
fn remap(
context: *anyopaque,
memory: []u8,
alignment: mem.Alignment,
new_len: usize,
return_address: usize,
) ?[*]u8 {
return if (resize(context, memory, alignment, new_len, return_address)) memory.ptr else null;
}
fn free( fn free(
ctx: *anyopaque, ctx: *anyopaque,
buf: []u8, buf: []u8,
log2_buf_align: u8, alignment: mem.Alignment,
return_address: usize, return_address: usize,
) void { ) void {
_ = ctx; _ = ctx;
_ = return_address; _ = return_address;
lock.lock(); lock.lock();
defer lock.unlock(); defer lock.unlock();
const buf_align = @as(usize, 1) << @as(Allocator.Log2Align, @intCast(log2_buf_align)); const buf_align = alignment.toByteUnits();
const actual_len = @max(buf.len + @sizeOf(usize), buf_align); const actual_len = @max(buf.len + @sizeOf(usize), buf_align);
const slot_size = math.ceilPowerOfTwoAssert(usize, actual_len); const slot_size = math.ceilPowerOfTwoAssert(usize, actual_len);
const class = math.log2(slot_size) - min_class; const class = math.log2(slot_size) - min_class;
@ -158,3 +168,11 @@ pub fn SbrkAllocator(comptime sbrk: *const fn (n: usize) usize) type {
} }
}; };
} }
test SbrkAllocator {
_ = SbrkAllocator(struct {
fn sbrk(_: usize) usize {
return 0;
}
}.sbrk);
}