aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/kata/sensei/queue.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai.old/kata/sensei/queue.zig')
-rw-r--r--mirai.old/kata/sensei/queue.zig70
1 files changed, 70 insertions, 0 deletions
diff --git a/mirai.old/kata/sensei/queue.zig b/mirai.old/kata/sensei/queue.zig
new file mode 100644
index 0000000..943d70c
--- /dev/null
+++ b/mirai.old/kata/sensei/queue.zig
@@ -0,0 +1,70 @@
+//! Run queue management
+
+const types = @import("../types.zig");
+
+var head: ?*types.Kata = null;
+
+pub fn get_head() ?*types.Kata {
+ return head;
+}
+
+pub fn enqueue(kata: *types.Kata) void {
+ kata.state = .Alive;
+
+ if (head == null) {
+ head = kata;
+ kata.next = null;
+ return;
+ }
+
+ var prev: ?*types.Kata = null;
+ var current = head;
+
+ while (current) |curr| {
+ if (kata.vruntime < curr.vruntime) {
+ kata.next = curr;
+ if (prev) |p| {
+ p.next = kata;
+ } else {
+ head = kata;
+ }
+ return;
+ }
+ prev = curr;
+ current = curr.next;
+ }
+
+ if (prev) |p| {
+ p.next = kata;
+ kata.next = null;
+ }
+}
+
+pub fn dequeue(kata: *types.Kata) void {
+ if (head == null) return;
+
+ if (head == kata) {
+ head = kata.next;
+ kata.next = null;
+ return;
+ }
+
+ var prev = head;
+ while (prev) |p| {
+ if (p.next == kata) {
+ p.next = kata.next;
+ kata.next = null;
+ return;
+ }
+ prev = p.next;
+ }
+}
+
+pub fn is_queued(kata: *types.Kata) bool {
+ var current = head;
+ while (current) |k| {
+ if (k == kata) return true;
+ current = k.next;
+ }
+ return false;
+}