sylveos

Toy Operating System
Log | Files | Refs

commit a20b8cb3f7361077ee44f182dc3429c04bc37482
parent cb7d76930d24502ddd809028be54fdb6447b971c
Author: Sylvia Ivory <git@sivory.net>
Date:   Sun, 25 Jan 2026 20:47:33 -0800

Add destroy on Scheduler

Diffstat:
Msrc/scheduler.zig | 28+++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/scheduler.zig b/src/scheduler.zig @@ -24,8 +24,22 @@ pub const Task = struct { stack: [1024]usize align(8), }; -pub fn new(gpa: std.mem.Allocator) Self { - return .{ .tid_counter = 1, .tasks = .{}, .scheduler_task = undefined, .allocator = gpa }; +pub fn new(gpa: std.mem.Allocator) !*Self { + const scheduler = try gpa.create(Self); + scheduler.* = .{ .tid_counter = 1, .tasks = .{}, .scheduler_task = undefined, .allocator = gpa }; + + return scheduler; +} + +pub fn destroy(self: *Self) void { + var task_node = self.tasks.first; + + while (task_node) |n| { + task_node = n.next; + self.allocator.destroy(self.get_current()); + } + + self.allocator.destroy(self); } fn push_stack(sp: *usize, value: usize) *usize { @@ -85,10 +99,10 @@ pub fn yield(self: *Self) void { return; } - const node = self.tasks.popFirst().?; - self.tasks.append(node); - const current: *Task = @alignCast(@fieldParentPtr("node", node)); + const node_task = self.tasks.popFirst().?; + self.tasks.append(node_task); + const current: *Task = @alignCast(@fieldParentPtr("node", node_task)); context_switch(&current.saved_sp, self.get_current().saved_sp); } @@ -108,8 +122,8 @@ export fn trampoline_inner(self: *Self) callconv(.c) void { // Free the task self.allocator.destroy(current); - if (self.tasks.first) |node| { - const next: *Task = @alignCast(@fieldParentPtr("node", node)); + if (self.tasks.first) |node_task| { + const next: *Task = @alignCast(@fieldParentPtr("node", node_task)); context_switch(&saved_sp, next.saved_sp); } else { context_switch(&saved_sp, self.scheduler_task.saved_sp);