Files
l2/tests/async.sl

80 lines
2.1 KiB
Plaintext
Raw Permalink Normal View History

import ../stdlib/stdlib.sl
import ../stdlib/io.sl
import ../stdlib/mem.sl
import ../stdlib/async.sl
# ── Worker words for scheduler tests ─────────────────────────
word worker_a
1 puti cr
yield
3 puti cr
yield
5 puti cr
end
word worker_b
2 puti cr
yield
4 puti cr
yield
6 puti cr
end
word worker_single
42 puti cr
end
word main
# ── task_new / task_status / task_entry_fn / task_stack_base/size ──
&worker_single task_new
dup task_status puti cr # 0 (TASK_READY)
dup task_stack_base 0 != puti cr # 1 (non-null)
dup task_stack_size puti cr # 8192
dup task_entry_fn 0 != puti cr # 1 (non-null fn ptr)
dup task_data_sp 0 != puti cr # 1 (non-null)
dup task_ret_sp puti cr # 0 (not yet started)
task_free
# ── sched_new / sched_task_count ──
8 sched_new
dup sched_task_count puti cr # 0
dup sched_tasks_ptr 0 != puti cr # 1 (non-null)
# ── sched_spawn ──
&worker_a sched_spawn
dup sched_task_count puti cr # 1
&worker_b sched_spawn
dup sched_task_count puti cr # 2
# ── sched_run (interleaved output) ──
sched_run # prints: 1 2 3 4 5 6
# ── post-run: verify we returned cleanly ──
99 puti cr # 99
sched_free
# ── single-task scheduler (no yield in worker) ──
4 sched_new
&worker_single sched_spawn
sched_run # prints: 42
sched_free
# ── three workers to test round-robin with more tasks ──
8 sched_new
&worker_a sched_spawn
&worker_b sched_spawn
&worker_single sched_spawn
dup sched_task_count puti cr # 3
sched_run # worker_a:1, worker_b:2, worker_single:42
# worker_a:3, worker_b:4
# worker_a:5, worker_b:6
sched_free
100 puti cr # 100 (clean exit)
end