nx_wflow_mapping_negative_gate_t278.nx source
↩ module page · 52 lines · 2396 B
1import "nx_wflow_mapping_oldpair_fixture_t278.nx"
2import "nx_gate_verdict.nx"
3// Read only the first /proc statm field; reuse caller scratch so measurement adds no mapping.
4func wt_pages(byte:*u8)->i64{
5 let fd:i64=sys_openat_rd("/proc/self/statm")
6 if fd<0{return 0-1}
7 var value:i64=0;var digits:i64=0;var rc:i64=0-1
8 while 1{
9 let n:i64=sys_read(fd,byte,1)
10 if n!=1{break}
11 if byte[0]==(32 as u8){if digits>0{rc=value};break}
12 if byte[0]<(48 as u8){break};if byte[0]>(57 as u8){break}
13 let digit:i64=(byte[0] as i64)-48
14 if value>(WF_TEXT_I64_MAX-digit)/10{break}
15 value=value*10+digit;digits=digits+1
16 }
17 if sys_close(fd)!=0{return 0-1};return rc
18}
19func wt_cycle(cx:*i64,index:i64)->i64{
20 if wf_emit_var(cx[2] as *u8,"run","k","v")!=0{return 1}
21 if wf_bind_event(cx,"run","event~k=v")!=1{return 2}
22 let value:*WfOwnedText=wf_var_owned(cx,"run","k")
23 if value==(0 as *WfOwnedText){return 3}
24 if wf_text_free(value)!=0{return 4}
25 let subst:*WfOwnedText=wf_subst_owned(cx,"run","{k}")
26 if subst==(0 as *WfOwnedText){return 5}
27 if wf_text_free(subst)!=0{return 6}
28 let scratch:*WfRunScratch=wf_run_scratch_new(1)
29 if scratch==(0 as *WfRunScratch){return 7}
30 if wf_run_scratch_free(scratch)!=0{return 8}
31 if wf_emit_iter(cx[2] as *u8,"run",index,"v")!=0{return 9}
32 return 0
33}
34func main(argc:i64,argv:*i64)->i64{
35 if argc!=3{return 2};let cycles:i64=wf_atoi(argv[1] as *u8);if cycles<=0{return 2}
36 let path:*u8=argv[2] as *u8;let fd:i64=sys_openat_exclusive(path,MODE_0600)
37 if fd<0{return 3};if sys_close(fd)!=0{return 3}
38 let byte:*u8=sys_mmap_try(1);let cx:*i64=sys_mmap_try(3*__size_of(i64)) as *i64
39 if (byte as i64)<=0{return 4};if (cx as i64)<=0{return 4};cx[2]=path as i64
40 let ctr:*i64=gv_ctr()
41 gv_check_eq("warm owned lifecycle",wt_cycle(cx,0),0,ctr)
42 let before:i64=wt_pages(byte)
43 var i:i64=0;var error:i64=0
44 while i<cycles{let rc:i64=wt_cycle(cx,i+1);if rc!=0{error=rc;break};i=i+1}
45 let after:i64=wt_pages(byte)
46 gv_check_eq("all owned cycles",i,cycles,ctr)
47 gv_check_eq("cycle error",error,0,ctr)
48 gv_check("mapping measurement available",before>0,ctr)
49 gv_check_eq("virtual mapping pages unchanged after owned cycles",after,before,ctr)
50 sys_munmap_direct(byte,1);sys_munmap_direct(cx as *u8,3*__size_of(i64))
51 return gv_verdict("WFLOW-OWNED-MAPPING-LIFECYCLE-T278",ctr,"Actual proc statm mapping extent, matching allocator release; no memory-free return-only inference")
52}