From d77714e11a2c60ab86246d636396b46ca460e904 Mon Sep 17 00:00:00 2001 From: cozis Date: Mon, 8 Jun 2026 10:12:41 +0200 Subject: [PATCH] scheduler: pick ready tasks randomly --- src/scheduler.zig | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/scheduler.zig b/src/scheduler.zig index 640b74e..4a63f61 100644 --- a/src/scheduler.zig +++ b/src/scheduler.zig @@ -163,14 +163,37 @@ pub fn despawnNested(self: *Scheduler, id: TaskID) void { _ = self.tasks.orderedRemove(index); } -fn findTaskWithState(self: *Scheduler, state: State) ?*Task { +fn countTasksWithState(self: *Scheduler, state: State) usize { + var count: usize = 0; for (self.tasks.items) |*task| { if (task.state == state) + count += 1; + } + return count; +} + +fn findNthTaskWithState(self: *Scheduler, state: State, index: usize) ?*Task { + var remaining = index; + for (self.tasks.items) |*task| { + if (task.state != state) + continue; + if (remaining == 0) return task; + remaining -= 1; } return null; } +fn pickReadyTask(self: *Scheduler) ?*Task { + const ready_count = self.countTasksWithState(.ready); + if (ready_count == 0) + return null; + + const random = self.prng.random(); + const index = random.uintLessThan(usize, ready_count); + return self.findNthTaskWithState(.ready, index).?; +} + fn findTaskIndexByID(self: *Scheduler, id: TaskID) ?usize { for (self.tasks.items, 0..) |*task, i| { if (task.id == id) @@ -234,7 +257,7 @@ fn advanceTimeAndPickTask(self: *Scheduler) ?*Task { } pub fn scheduleOne(self: *Scheduler) bool { - const task = self.findTaskWithState(.ready) orelse self.advanceTimeAndPickTask() orelse return false; + const task = self.pickReadyTask() orelse self.advanceTimeAndPickTask() orelse return false; const id = task.id; self.current_id = id; task.state = .running;