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); } }