code wiki / (root) / nx_wflow_owned_mapping_gate_t278.nx

nx_wflow_owned_mapping_gate_t278.nx source

↩ module page · 52 lines · 2398 B

1import "nx_wflow_engine_capacity_candidate_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}