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}