code wiki / (root) / nx_id_concurrent_canonical_gate_t190.nx

nx_id_concurrent_canonical_gate_t190.nx source

↩ module page · 36 lines · 1743 B

1import "nx_apistack_idempotency.nx" 2import "nx_gate_verdict.nx" 3import "nx_itoa_lib.nx" 4func ic_child(p:*u8,label:*u8)->i64{ 5 let key:*u8=sys_mmap(64) 6 var i:i64=0 7 while i<100{ 8 key[0]=label[0];key[1]=45 as u8 9 let n:i64=ccz_cat_num(key,2,i) 10 if id_record(p,key,n,"rc=0",4)!=1{return 1};i=i+1 11 };return 0 12} 13func main()->i64{ 14 let c:*i64=gv_ctr();let p:*u8="knowledge/gates/id-concurrent-canonical-t190.jrnl" 15 let fd:i64=__syscall(257,AT_FDCWD,p,193,MODE_0600,0,0) 16 gv_check("exclusive test ledger",fd>=0,c);if fd<0{return 1};sys_close(fd) 17 let first:i64=sys_fork();if first==0{sys_exit(ic_child(p,"A"));return 99} 18 let second:i64=sys_fork();if second==0{sys_exit(ic_child(p,"B"));return 99} 19 let sa:*i64=sys_mmap(8) as *i64;let sb:*i64=sys_mmap(8) as *i64 20 var wa:i64=0-1;var wb:i64=0-1 21 if first>0{wa=sys_wait4(first,sa,0)};if second>0{wb=sys_wait4(second,sb,0)} 22 gv_check("first owned writer complete",first>0&&wa==first&&wait_status_rc(sa[0])==0,c) 23 gv_check("second owned writer complete",second>0&&wb==second&&wait_status_rc(sb[0])==0,c) 24 let key:*u8=sys_mmap(64);let out:*u8=sys_mmap(8);var pass:i64=0;var label:i64=65 25 while label<=66{ 26 var i:i64=0;while i<100{ 27 key[0]=label as u8;key[1]=45 as u8;let n:i64=ccz_cat_num(key,2,i) 28 if id_lookup(p,key,n,out,8)==4{if out[0]==114 as u8&&out[3]==48 as u8{pass=pass+1}} 29 i=i+1 30 };label=label+1 31 } 32 gv_check("all200 concurrent records retained without interleaving",pass==200,c) 33 let stat:*u8=sys_mmap(NX_STAT_X64_BYTES) 34 gv_check("journal bytes exact across concurrent appends",sys_fstatat(p,stat)==0&&*((stat+NX_STAT_X64_SIZE_OFFSET) as *i64)==1980,c) 35 return gv_verdict("idempotency-concurrent-append",c,"Append serialization only; lookup/mutate/record is not a transaction") 36}