code wiki / _hdl_build / nx_synth_serve_daemon.nx
nx_synth_serve_daemon.nx source
↩ module page · 40 lines · 2109 B
1// nx_synth_serve_daemon.nx -- deployable Synth Studio daemon: argv[1]=listen_port; accept-fork loop calling
2// sv_serve_conn (nx_synth_serve). Runs on loopback behind the site proxy (/synth -> this port). Forks per
3// connection so the heavy per-request render mmaps are reclaimed by the kernel on child exit. license_tier: ORIGINAL
4import "nx_synth_serve.nx"
5import "nx_syscalls.nx"
6const K_MAGIC_1000000: i64 = 1000000
7
8func sd_atoi(s: *u8) -> i64 { var v: i64=0; var i: i64=0; while s[i]!=(0 as u8){ let c: i64=s[i] as i64; if c<48{return v} if c>57{return v} v=v*10+(c-48); i=i+1 } return v }
9
10func main(argc: i64, argv: *i64) -> i64 {
11 if argc < 2 { sys_write(1, "usage: nx_synth_serve_daemon <port> [budget]\n" as *u8, 44); sys_exit(2); return 2 }
12 let port: i64 = sd_atoi(argv[1] as *u8)
13 var budget: i64 = K_MAGIC_1000000
14 if argc > 2 { budget = sd_atoi(argv[2] as *u8) }
15 let addr: *u8 = sys_mmap(16)
16 addr[0]=2 as u8; addr[1]=0 as u8; addr[2]=((port>>8)&0xff) as u8; addr[3]=(port&0xff) as u8
17 addr[4]=0 as u8; addr[5]=0 as u8; addr[6]=0 as u8; addr[7]=0 as u8
18 var zi: i64=8; while zi<16 { addr[zi]=0 as u8; zi=zi+1 }
19 let lfd: i64 = sys_socket(2, 1, 0)
20 if lfd < 0 { sys_write(1, "SOCKET-FAIL\n" as *u8, 12); sys_exit(1); return 1 }
21 let optv: *u8 = sys_mmap(4); optv[0]=1 as u8
22 sys_setsockopt(lfd, 1, 2, optv, 4)
23 if sys_bind(lfd, addr, 16) < 0 { sys_write(1, "BIND-FAIL\n" as *u8, 10); sys_exit(1); return 1 }
24 if sys_listen(lfd, 16) < 0 { sys_write(1, "LISTEN-FAIL\n" as *u8, 12); sys_exit(1); return 1 }
25 sys_write(1, "SYNTH-STUDIO-UP\n" as *u8, 16)
26 let st: *i64 = sys_mmap(16) as *i64
27 var served: i64 = 0
28 while served < budget {
29 let cfd: i64 = sys_accept(lfd)
30 if cfd >= 0 {
31 let pid: i64 = sys_fork()
32 if pid == 0 { sys_close(lfd); sv_serve_conn(cfd); sys_close(cfd); sys_exit(0) }
33 sys_close(cfd)
34 var reaped: i64 = 1
35 while reaped > 0 { reaped = sys_wait4(0 - 1, st, 1) }
36 }
37 served = served + 1
38 }
39 sys_close(lfd); sys_exit(0); return 0
40}