aboutsummaryrefslogtreecommitdiff
path: root/mirai/kata/sensei/waker.zig
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);
    }
}