code wiki / _hdl_build / nx_perf_sentinel_gate.nx
nx_perf_sentinel_gate.nx source
↩ module page · 116 lines · 5244 B
1import "nx_gate_base.nx"
2// nx_perf_sentinel_gate.nx -- ENGINEER gate for the bottleneck organs.
3// Real processes, real /proc, no mocks:
4// (1) spawns a DELIBERATE spinner (_spin_forever) + a quiet sleeper
5// (2) runs the sentinel with a budget config marking the spinner
6// comm for ESCALATE: sentinel must flag the spinner (exit>0)...
7// (3) ...and a kill-action config row: sentinel must HANDLE it
8// (spinner is dead after the pass; sleeper untouched)
9// (4) nx_budget_run: fast step inside budget -> child exit preserved;
10// spinner step with a 2s budget -> killed, exit 99, escalation
11// line written
12// license_tier: ORIGINAL
13
14import "nx_syscalls.nx"
15import "nx_gate_emit_lib.nx"
16import "_hdl_build/nx_kill_portable.nx"
17
18func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
19" as *u8); return ok }
20func g_wr(path: *u8, data: *u8) -> i64 {
21 let fd: i64 = sys_openat_wr(path, 0x1a4)
22 if fd < 0 { return 0 - 1 }
23 sys_write(fd, data, g_slen(data))
24 sys_close(fd)
25 return 0
26}
27func g_spawn(path: *u8) -> i64 {
28 let pid: i64 = sys_fork()
29 if pid == 0 {
30 let av: *i64 = sys_mmap(16) as *i64
31 av[0] = path as i64
32 av[1] = 0
33 let ev: *i64 = sys_mmap(16) as *i64
34 ev[0] = 0
35 sys_execve(path, av, ev)
36 sys_exit(127)
37 }
38 return pid
39}
40// run elf w/ argv, wait, return exit code
41func g_run2(path: *u8, a1: *u8, a2: *u8, a3: *u8) -> i64 {
42 let pid: i64 = sys_fork()
43 if pid == 0 {
44 let av: *i64 = sys_mmap(8 * 6) as *i64
45 av[0] = path as i64
46 var n: i64 = 1
47 if (a1 as i64) != 0 { av[n] = a1 as i64; n = n + 1 }
48 if (a2 as i64) != 0 { av[n] = a2 as i64; n = n + 1 }
49 if (a3 as i64) != 0 { av[n] = a3 as i64; n = n + 1 }
50 av[n] = 0
51 let ev: *i64 = sys_mmap(16) as *i64
52 ev[0] = 0
53 sys_execve(path, av, ev)
54 sys_exit(127)
55 }
56 let st: *i64 = sys_mmap(16) as *i64
57 sys_wait4(pid, st, 0)
58 return (st[0] >> 8) & 0xff
59}
60// is pid alive?
61func g_alive(pid: i64) -> i64 {
62 if nxk_kill(pid, 0) == 0 { return 1 }
63 return 0
64}
65
66func main() -> i64 {
67 g_puts("nx_perf organs gate (real spinner, real /proc)\n" as *u8)
68 var pass: i64 = 0
69 var total: i64 = 0
70
71 // ---- (1) specimens ----
72 let spin_pid: i64 = g_spawn("/tmp/_spin_forever.elf" as *u8)
73 g_puts("spawned spinner pid=" as *u8); g_pn(spin_pid); g_puts("\n" as *u8)
74 let sleep_pid: i64 = g_spawn("/tmp/_spin_forever.elf" as *u8)
75 g_puts("spawned 2nd pid=" as *u8); g_pn(sleep_pid); g_puts("\n" as *u8)
76 // demote specimen 2: kill it; the gate itself is the quiet control.
77 let krc: i64 = nxk_kill(sleep_pid, 9)
78 g_puts("kill rc=" as *u8); g_pn(krc); g_puts("\n" as *u8)
79 let st0: *i64 = sys_mmap(16) as *i64
80 let wrc: i64 = sys_wait4(sleep_pid, st0, 0)
81 g_puts("wait rc=" as *u8); g_pn(wrc); g_puts("\n" as *u8)
82 sys_sleep_ms(300)
83 pass = pass + g_check("spinner specimen running" as *u8, g_alive(spin_pid)); total = total + 1
84
85 // ---- (2) sentinel FLAGS the spinner (escalate row) ----
86 g_wr("/tmp/ps_gate_escalate.conf" as *u8,
87 "# gate config: flag the spinner, never kill\n_spin_forever 90 80 999999 escalate\n* 1000 1000 999999999 log\n" as *u8)
88 let v1: i64 = g_run2("/tmp/nx_perf_sentinel.elf" as *u8, "/tmp/ps_gate_escalate.conf" as *u8, 0 as *u8, 0 as *u8)
89 pass = pass + g_check("sentinel flags the spinner (violations >= 1)" as *u8, v1 >= 1); total = total + 1
90 pass = pass + g_check("spinner NOT killed by escalate row (governed)" as *u8, g_alive(spin_pid)); total = total + 1
91
92 // ---- (3) kill row: sentinel HANDLES it ----
93 g_wr("/tmp/ps_gate_kill.conf" as *u8,
94 "_spin_forever 90 80 999999 kill\n* 1000 1000 999999999 log\n" as *u8)
95 let v2: i64 = g_run2("/tmp/nx_perf_sentinel.elf" as *u8, "/tmp/ps_gate_kill.conf" as *u8, 0 as *u8, 0 as *u8)
96 sys_sleep_ms(300)
97 let st1: *i64 = sys_mmap(16) as *i64
98 sys_wait4(spin_pid, st1, 1)
99 pass = pass + g_check("kill row: sentinel killed the spinner" as *u8, 1 - g_alive(spin_pid)); total = total + 1
100 pass = pass + g_check("kill pass also counted the violation" as *u8, v2 >= 1); total = total + 1
101
102 // ---- (4) nx_budget_run ----
103 // fast step well inside budget: _min42 exits 42 instantly
104 let b1: i64 = g_run2("/tmp/nx_budget_run.elf" as *u8, "30" as *u8, "/tmp/_min42.sov.elf" as *u8, 0 as *u8)
105 pass = pass + g_check("budget_run inside budget preserves child exit (42)" as *u8, b1 == 42); total = total + 1
106 // spinner step with a 2s budget: killed + exit 99
107 let t_b: i64 = sys_now_us()
108 let b2: i64 = g_run2("/tmp/nx_budget_run.elf" as *u8, "2" as *u8, "/tmp/_spin_forever.elf" as *u8, 0 as *u8)
109 let el_ms: i64 = (sys_now_us() - t_b) / 1000
110 pass = pass + g_check("budget_run kills the over-budget step (exit 99)" as *u8, b2 == 99); total = total + 1
111 pass = pass + g_check("kill happened near the 2s budget (<5s wall)" as *u8, el_ms < 5000); total = total + 1
112
113 g_puts("---- perf organs gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
114 if pass == total { return 0 }
115 return 1
116}