mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-02-04 14:33:47 +00:00
Properly maintain the ArenaPool's free_list_len
This commit is contained in:
@@ -56,6 +56,7 @@ pub fn deinit(self: *ArenaPool) void {
|
|||||||
pub fn acquire(self: *ArenaPool) !Allocator {
|
pub fn acquire(self: *ArenaPool) !Allocator {
|
||||||
if (self.free_list) |entry| {
|
if (self.free_list) |entry| {
|
||||||
self.free_list = entry.next;
|
self.free_list = entry.next;
|
||||||
|
self.free_list_len -= 1;
|
||||||
return entry.arena.allocator();
|
return entry.arena.allocator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +73,8 @@ pub fn release(self: *ArenaPool, allocator: Allocator) void {
|
|||||||
const arena: *std.heap.ArenaAllocator = @ptrCast(@alignCast(allocator.ptr));
|
const arena: *std.heap.ArenaAllocator = @ptrCast(@alignCast(allocator.ptr));
|
||||||
const entry: *Entry = @fieldParentPtr("arena", arena);
|
const entry: *Entry = @fieldParentPtr("arena", arena);
|
||||||
|
|
||||||
if (self.free_list_len == self.free_list_max) {
|
const free_list_len = self.free_list_len;
|
||||||
|
if (free_list_len == self.free_list_max) {
|
||||||
arena.deinit();
|
arena.deinit();
|
||||||
self.entry_pool.destroy(entry);
|
self.entry_pool.destroy(entry);
|
||||||
return;
|
return;
|
||||||
@@ -80,5 +82,6 @@ pub fn release(self: *ArenaPool, allocator: Allocator) void {
|
|||||||
|
|
||||||
_ = arena.reset(.{ .retain_with_limit = self.retain_bytes });
|
_ = arena.reset(.{ .retain_with_limit = self.retain_bytes });
|
||||||
entry.next = self.free_list;
|
entry.next = self.free_list;
|
||||||
|
self.free_list_len = free_list_len + 1;
|
||||||
self.free_list = entry;
|
self.free_list = entry;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user