std.heap.memory_pool: make preheat() usable after init()

This commit is contained in:
John Benediktsson
2025-01-07 21:34:18 -08:00
committed by Alex Rønne Petersen
parent eed3b9567d
commit 884b1423a4

View File

@@ -69,17 +69,7 @@ pub fn MemoryPoolExtra(comptime Item: type, comptime pool_options: Options) type
pub fn initPreheated(allocator: std.mem.Allocator, initial_size: usize) MemoryPoolError!Pool {
var pool = init(allocator);
errdefer pool.deinit();
var i: usize = 0;
while (i < initial_size) : (i += 1) {
const raw_mem = try pool.allocNew();
const free_node = @as(NodePtr, @ptrCast(raw_mem));
free_node.* = Node{
.next = pool.free_list,
};
pool.free_list = free_node;
}
try pool.preheat(initial_size);
return pool;
}
@@ -89,6 +79,21 @@ pub fn MemoryPoolExtra(comptime Item: type, comptime pool_options: Options) type
pool.* = undefined;
}
/// Preheats the memory pool by pre-allocating `size` items.
/// This allows up to `size` active allocations before an
/// `OutOfMemory` error might happen when calling `create()`.
pub fn preheat(pool: *Pool, size: usize) MemoryPoolError!void {
var i: usize = 0;
while (i < size) : (i += 1) {
const raw_mem = try pool.allocNew();
const free_node = @as(NodePtr, @ptrCast(raw_mem));
free_node.* = Node{
.next = pool.free_list,
};
pool.free_list = free_node;
}
}
pub const ResetMode = std.heap.ArenaAllocator.ResetMode;
/// Resets the memory pool and destroys all allocated items.