From 9c48a5207c2496c00ffa55b1969d090dfb9d4123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gr=C3=A9goire?= Date: Sun, 26 Jul 2026 20:41:01 -0400 Subject: [PATCH] ke/smr: expose simpler APIs --- src/kern/root.zig | 2 ++ src/kern/smr.zig | 10 ++++++++++ src/mm/zone.zig | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/kern/root.zig b/src/kern/root.zig index a9fd337..94fdb54 100644 --- a/src/kern/root.zig +++ b/src/kern/root.zig @@ -92,6 +92,8 @@ pub const smr = struct { pub const exit = p.smr.exit; pub const enter = p.smr.enter; pub const poll = p.smr.poll; + pub const wait = p.smr.wait; + pub const synchronize = p.smr.synchronize; pub const seq_invalid = p.smr.seq_invalid; diff --git a/src/kern/smr.zig b/src/kern/smr.zig index d7d58c5..4cafea1 100644 --- a/src/kern/smr.zig +++ b/src/kern/smr.zig @@ -321,6 +321,16 @@ pub fn exit(dom: *Domain, ipl: ke.Ipl) void { ke.ipl.lower(ipl); } +/// Wait for a given goal to happen. +pub fn wait(dom: *Domain, goal: Sequence) void { + poll(dom, goal, true); +} + +/// Wait until all readers have left their read sections. +pub fn synchronize(dom: *Domain) void { + wait(dom, advance(dom)); +} + // Called by the scheduler when a thread in an SMR section got preempted. pub fn mark_thread_stalled(td: *ke.Thread) void { var it = td.smr_sections.iterator(); diff --git a/src/mm/zone.zig b/src/mm/zone.zig index f4390ae..685d4b4 100644 --- a/src/mm/zone.zig +++ b/src/mm/zone.zig @@ -801,7 +801,7 @@ pub const Zone = struct { if (self.smr) |smr| { // Direct frees must synchronize, the object is instantly reusable. - _ = ke.smr.poll(smr, ke.smr.advance(smr), true); + _ = ke.smr.synchronize(smr); } self.lock.acquire(); @@ -1080,7 +1080,7 @@ pub const Zone = struct { ke.smr.deferred_advance_commit(smr, magazine.seq); // Wait until we can destroy the magazine. - _ = ke.smr.poll(smr, magazine.seq, true); + _ = ke.smr.wait(smr, magazine.seq); } }