diff --git a/src/ex/root.zig b/src/ex/root.zig index 5614e58..a51f4fa 100644 --- a/src/ex/root.zig +++ b/src/ex/root.zig @@ -3,6 +3,7 @@ pub const private = @import("private.zig"); const p = private; pub const WorkItem = p.work.WorkItem; +pub const DelayedWorkItem = p.work.DelayedWorkItem; pub const Console = p.console.Console; pub const work = struct { diff --git a/src/ex/work.zig b/src/ex/work.zig index 57e442a..3482b13 100644 --- a/src/ex/work.zig +++ b/src/ex/work.zig @@ -40,8 +40,6 @@ pub const WorkItem = struct { link: rtl.List.Entry, enqueued: std.atomic.Value(bool), priority: Priority, - dpc: ke.Dpc, - timer: ke.Timer, pub const Priority = enum { /// Low priority background work. @@ -67,10 +65,29 @@ pub const WorkItem = struct { .link = undefined, .enqueued = .init(false), .priority = priority, + }; + } +}; + +/// Represents a work item that will be enqueued in a given amount of time. +pub const DelayedWorkItem = struct { + item: WorkItem, + dpc: ke.Dpc, + timer: ke.Timer, + + pub fn init( + self: *DelayedWorkItem, + priority: WorkItem.Priority, + func: *const fn (arg: ?*anyopaque) void, + arg: ?*anyopaque, + ) void { + self.* = .{ + .item = undefined, .dpc = .init(work_dpc), .timer = undefined, }; + self.item.init(priority, func, arg); self.timer.init(); } }; @@ -196,14 +213,14 @@ fn work_loop(p: ?*anyopaque) void { } } -/// Called when a work timer expires. +/// Called when a delayed work timer expires. fn work_dpc(dpc: *ke.Dpc, _: ?*anyopaque) void { - const item: *WorkItem = @fieldParentPtr("dpc", dpc); - enqueue(item); + const item: *DelayedWorkItem = @fieldParentPtr("dpc", dpc); + enqueue(&item.item); } /// Enqueue a work item in `time`. -pub fn enqueue_in(item: *WorkItem, time: r.Nanoseconds) void { +pub fn enqueue_in(item: *DelayedWorkItem, time: r.Nanoseconds) void { ke.timer.set(&item.timer, time, &item.dpc); } diff --git a/src/mm/zone.zig b/src/mm/zone.zig index 685d4b4..1808d09 100644 --- a/src/mm/zone.zig +++ b/src/mm/zone.zig @@ -119,7 +119,7 @@ const mi = mm.private; /// Interval at which we do housekeeping (working set update, reaping, etc.) const update_interval_s = 15; const update_interval = std.time.ns_per_s * update_interval_s; -var update_work_item: ex.WorkItem = undefined; +var update_work_item: ex.DelayedWorkItem = undefined; /// Fixed point conversion for WMA computation. const wma_unit = 256;