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}