scheduler: pick ready tasks randomly
This commit is contained in:
+25
-2
@@ -163,14 +163,37 @@ pub fn despawnNested(self: *Scheduler, id: TaskID) void {
|
|||||||
_ = self.tasks.orderedRemove(index);
|
_ = 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| {
|
for (self.tasks.items) |*task| {
|
||||||
if (task.state == state)
|
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;
|
return task;
|
||||||
|
remaining -= 1;
|
||||||
}
|
}
|
||||||
return null;
|
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 {
|
fn findTaskIndexByID(self: *Scheduler, id: TaskID) ?usize {
|
||||||
for (self.tasks.items, 0..) |*task, i| {
|
for (self.tasks.items, 0..) |*task, i| {
|
||||||
if (task.id == id)
|
if (task.id == id)
|
||||||
@@ -234,7 +257,7 @@ fn advanceTimeAndPickTask(self: *Scheduler) ?*Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn scheduleOne(self: *Scheduler) bool {
|
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;
|
const id = task.id;
|
||||||
self.current_id = id;
|
self.current_id = id;
|
||||||
task.state = .running;
|
task.state = .running;
|
||||||
|
|||||||
Reference in New Issue
Block a user