diff options
Diffstat (limited to 'mirai/memory/zone/gc/gc.zig')
| -rw-r--r-- | mirai/memory/zone/gc/gc.zig | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/mirai/memory/zone/gc/gc.zig b/mirai/memory/zone/gc/gc.zig new file mode 100644 index 0000000..a2faaad --- /dev/null +++ b/mirai/memory/zone/gc/gc.zig @@ -0,0 +1,43 @@ +//! Zone Garbage Collection + +const types = @import("../types/types.zig"); +const Zone = types.Zone; +const ZonePageMeta = types.ZonePageMeta; + +const bootstrap = @import("../bootstrap/bootstrap.zig"); +const alloc_mod = @import("../alloc/alloc.zig"); +const pmm = @import("../../../pmm/pmm.zig"); + +pub fn collect(zone: *Zone) usize { + var freed: usize = 0; + var prev: ?*ZonePageMeta = null; + var current = zone.partial_pages; + + while (current) |page_meta| { + const next_page = page_meta.next; + + if (page_meta.in_use == 0) { + if (prev) |prev_page| { + prev_page.next = next_page; + } else { + zone.partial_pages = next_page; + } + + zone.page_count -|= 1; + pmm.free_page(page_meta.page_phys); + + if (!bootstrap.is_early_meta(page_meta)) { + const page_meta_zone = bootstrap.get_page_meta_zone(); + alloc_mod.zfree(page_meta_zone, @ptrCast(page_meta)); + } + + freed += 1; + } else { + prev = page_meta; + } + + current = next_page; + } + + return freed; +} |
