diff options
author | 2022-08-21 01:08:40 -0700 | |
---|---|---|
committer | 2022-08-21 01:08:40 -0700 | |
commit | 6ab53fca367b2f3c72e5cde4018acd00f3f6182c (patch) | |
tree | b963b7acb9340baf3c128663621c2f3564867082 /src | |
parent | 8fafc2f9edde09e6bcfd2c59db7266595faf75bf (diff) | |
download | bun-6ab53fca367b2f3c72e5cde4018acd00f3f6182c.tar.gz bun-6ab53fca367b2f3c72e5cde4018acd00f3f6182c.tar.zst bun-6ab53fca367b2f3c72e5cde4018acd00f3f6182c.zip |
Reduce allocations for `ObjectPool`
Diffstat (limited to 'src')
-rw-r--r-- | src/pool.zig | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/pool.zig b/src/pool.zig index 158214e4b..7894a5758 100644 --- a/src/pool.zig +++ b/src/pool.zig @@ -154,6 +154,31 @@ pub fn ObjectPool( pub fn has() bool { return data().loaded and data().list.first != null; } + + pub fn push(allocator: std.mem.Allocator, pooled: Type) void { + if (comptime @import("./env.zig").allow_assert) + std.debug.assert(!full()); + + var new_node = allocator.create(LinkedList.Node) catch unreachable; + new_node.* = LinkedList.Node{ + .allocator = allocator, + .data = pooled, + }; + release(new_node); + } + + pub fn getIfExists() ?*LinkedList.Node { + if (!data().loaded) { + return null; + } + + var node = data().list.popFirst() orelse return null; + if (comptime std.meta.trait.isContainer(Type) and @hasDecl(Type, "reset")) node.data.reset(); + if (comptime max_count > 0) data().count -|= 1; + + return node; + } + pub fn get(allocator: std.mem.Allocator) *LinkedList.Node { if (data().loaded) { if (data().list.popFirst()) |node| { |