authorgravatar for mrjbq7@gmail.comJohn Benediktsson <mrjbq7@gmail.com> 2025-01-07 21:34:18-08:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-01-28 00:06:54+01:00
log884b1423a4e33323b28d97b7458bade9a36acce9
tree1b9c1d906e36ccfb23bc0e61fe3aaa474635d147
parenteed3b9567d361941accf0b507dbe83a39b75dffb

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


1 files changed, 14 insertions(+), 9 deletions(-)

lib/std/heap/memory_pool.zig+14-9
......@@ -69,9 +69,22 @@ pub fn MemoryPoolExtra(comptime Item: type, comptime pool_options: Options) type
6969 pub fn initPreheated(allocator: std.mem.Allocator, initial_size: usize) MemoryPoolError!Pool {
7070 var pool = init(allocator);
7171 errdefer pool.deinit();
72 try pool.preheat(initial_size);
73 return pool;
74 }
75
76 /// Destroys the memory pool and frees all allocated memory.
77 pub fn deinit(pool: *Pool) void {
78 pool.arena.deinit();
79 pool.* = undefined;
80 }
7281
82 /// Preheats the memory pool by pre-allocating `size` items.
83 /// This allows up to `size` active allocations before an
84 /// `OutOfMemory` error might happen when calling `create()`.
85 pub fn preheat(pool: *Pool, size: usize) MemoryPoolError!void {
7386 var i: usize = 0;
74 while (i < initial_size) : (i += 1) {
87 while (i < size) : (i += 1) {
7588 const raw_mem = try pool.allocNew();
7689 const free_node = @as(NodePtr, @ptrCast(raw_mem));
7790 free_node.* = Node{
......@@ -79,14 +92,6 @@ pub fn MemoryPoolExtra(comptime Item: type, comptime pool_options: Options) type
7992 };
8093 pool.free_list = free_node;
8194 }
82
83 return pool;
84 }
85
86 /// Destroys the memory pool and frees all allocated memory.
87 pub fn deinit(pool: *Pool) void {
88 pool.arena.deinit();
89 pool.* = undefined;
9095 }
9196
9297 pub const ResetMode = std.heap.ArenaAllocator.ResetMode;