aboutsummaryrefslogtreecommitdiff
path: root/mirai/memory/zone/gc/gc.zig
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-03-30 15:02:42 +0530
committerBobby <[email protected]>2026-03-30 15:02:42 +0530
commit2324951126b542aeecfd8dd12b381265cce1566c (patch)
treea580fe97a13788fbe3b104e3a9553f551c2bff11 /mirai/memory/zone/gc/gc.zig
parent3c2c5c419cae1b7f2d60e8a3dc6e2e8c157b5a2f (diff)
downloadakiba-main.tar.xz
akiba-main.zip
refactor: reorganize kernel structure and implement memory management zonesHEADmain
Diffstat (limited to 'mirai/memory/zone/gc/gc.zig')
-rw-r--r--mirai/memory/zone/gc/gc.zig43
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;
+}