commit a20b8cb3f7361077ee44f182dc3429c04bc37482
parent cb7d76930d24502ddd809028be54fdb6447b971c
Author: Sylvia Ivory <git@sivory.net>
Date: Sun, 25 Jan 2026 20:47:33 -0800
Add destroy on Scheduler
Diffstat:
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(¤t.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);