blob: d18388b268d4188f1e386cdaed41d74fc66f02f5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
//! Wake functions
const kata_limits = @import("../../common/limits/kata.zig");
const keyboard = @import("../../drivers/keyboard/keyboard.zig");
const pool = @import("../pool.zig");
const queue = @import("queue.zig");
const types = @import("../types.zig");
pub fn wake_all_waiting() void {
for (0..kata_limits.MAX_KATAS) |i| {
if (!pool.used[i]) continue;
const kata = &pool.pool[i];
if (kata.state != .Stalled) continue;
const target = pool.get(kata.waiting_for);
// Wake if target doesn't exist, is zombie, or dissolved
if (target == null or target.?.state == .Zombie or target.?.state == .Dissolved) {
kata.state = .Alive;
queue.enqueue(kata);
kata.waiting_for = 0;
}
}
}
pub fn wake_waiting(target_id: u32) void {
for (0..kata_limits.MAX_KATAS) |i| {
if (!pool.used[i]) continue;
const kata = &pool.pool[i];
if (kata.state == .Stalled and kata.waiting_for == target_id) {
kata.state = .Alive;
queue.enqueue(kata);
kata.waiting_for = 0;
}
}
}
pub fn wake_blocked() void {
if (!keyboard.has_input()) return;
for (0..kata_limits.MAX_KATAS) |i| {
if (!pool.used[i]) continue;
const kata = &pool.pool[i];
if (kata.state == .Frozen) {
kata.state = .Alive;
queue.enqueue(kata);
return;
}
}
}
pub fn wake_one_blocked() void {
for (0..kata_limits.MAX_KATAS) |i| {
if (!pool.used[i]) continue;
const kata = &pool.pool[i];
if (kata.state == .Frozen) {
kata.state = .Alive;
queue.enqueue(kata);
return;
}
}
}
pub fn wake(kata_id: u32) void {
const kata = pool.get(kata_id) orelse return;
if (kata.state == .Frozen) {
kata.state = .Alive;
queue.enqueue(kata);
}
}
|