From 884b1423a4e33323b28d97b7458bade9a36acce9 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Tue, 7 Jan 2025 21:34:18 -0800 Subject: [PATCH] std.heap.memory_pool: make preheat() usable after init() --- lib/std/heap/memory_pool.zig | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) 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.