nx_pid_diag.nx source
↩ module page · 26 lines · 1120 B
1// nx_pid_diag.nx -- diagnose getpid + ml_pid_alive (the queue/tend/model-lane self-pid primitive).
2// license_tier: ORIGINAL expect_exit: 0
3import "nx_model_lane_core.nx"
4const K_MAGIC_2000: i64 = 2000
5
6func pd_gp(nr: i64) -> i64 { return __syscall(nr, 0, 0, 0, 0, 0, 0) }
7
8func main(argc: i64, argv: *i64) -> i64 {
9 std_puts("getpid(39)=" as *u8) std_pdec(pd_gp(39))
10 std_puts(" getpid(172)=" as *u8) std_pdec(pd_gp(172))
11 std_puts(" getpid(39)_alive=" as *u8) std_pdec(ml_pid_alive(pd_gp(39)))
12 std_puts(" getpid(172)_alive=" as *u8) std_pdec(ml_pid_alive(pd_gp(172)))
13 std_puts("\n" as *u8)
14 // fork-return pid (reliable): child sleeps, parent checks its liveness
15 let pid: i64 = sys_fork()
16 if pid == 0 { sys_sleep_ms(K_MAGIC_2000); sys_exit(0) }
17 std_puts("fork_child_pid=" as *u8) std_pdec(pid)
18 std_puts(" child_alive=" as *u8) std_pdec(ml_pid_alive(pid))
19 std_puts("\n" as *u8)
20 let st: *i64 = sys_mmap(64) as *i64
21 sys_wait4(pid, st, 0)
22 std_puts("after_reap child_alive=" as *u8) std_pdec(ml_pid_alive(pid))
23 std_putln("" as *u8)
24 sys_exit(0)
25 return 0
26}