mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
Fix build failure in sbrk allocator, caused by #20511
This commit is contained in:
parent
d7b93c7876
commit
1b62469ec9
@ -989,6 +989,7 @@ test {
|
|||||||
_ = GeneralPurposeAllocator;
|
_ = GeneralPurposeAllocator;
|
||||||
_ = FixedBufferAllocator;
|
_ = FixedBufferAllocator;
|
||||||
_ = ThreadSafeAllocator;
|
_ = ThreadSafeAllocator;
|
||||||
|
_ = SbrkAllocator;
|
||||||
if (builtin.target.isWasm()) {
|
if (builtin.target.isWasm()) {
|
||||||
_ = WasmAllocator;
|
_ = WasmAllocator;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user