diff --git a/lib/std/heap/memory_pool.zig b/lib/std/heap/memory_pool.zig index 5bfc4a60f6..6b9abfd8dc 100644 --- a/lib/std/heap/memory_pool.zig +++ b/lib/std/heap/memory_pool.zig @@ -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.