code wiki / _hdl_build / nx_mark_migrate.nx

nx_mark_migrate.nx source

↩ module page · 161 lines · 7761 B

1// nx_mark_migrate.nx -- X-Q-003b: migrate hand-seeded queue rows from prose 2// gate cells to LITERAL machine markers, so nx_reconcile can own their DONE 3// flip. Reads the marker MAP knowledge/registry/row_markers.tsv (id -> marker) 4// and, for each queue row whose id is in the map and whose gate cell lacks 5// "||MARK=", appends "||MARK=<marker>" to that row's gate field (field 7, before 6// the 8th tab). Idempotent (already-marked rows skipped); whole-file rewrite, 7// safe at this row count. (Rows generated by nx_gap_to_queue self-embed their 8// marker and need no map entry -- this organ is for pre-existing rows whose 9// gates ship later.) Appends MARKMIGRATE rows to knowledge/status/mark_migrate.log. 10// license_tier: ORIGINAL 11import "nx_registry_lock.nx" // lib-only (nx_syscalls transitive); rt_lock/rt_unlock for the shared queue lock 12const K_MAGIC_131072: i64 = 131072 13const K_MAGIC_1048576: i64 = 1048576 14const K_MAGIC_1310720: i64 = 1310720 15 16func mm_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 17func mm_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 } 18 19func mm_read(path: *u8, buf: *u8, cap: i64) -> i64 { 20 let fd: i64 = sys_openat_rd(path) 21 if fd < 0 { return 0 } 22 var n: i64 = 0 23 var r: i64 = sys_read(fd, buf, cap - 1) 24 while r > 0 { n = n + r; if n >= cap - 1 { r = 0 } else { r = sys_read(fd, buf + n, cap - 1 - n) } } 25 sys_close(fd) 26 buf[n] = 0 as u8 27 return n 28} 29 30func mm_at(buf: *u8, n: i64, i: i64, pat: *u8, pl: i64) -> i64 { 31 if i + pl > n { return 0 } 32 var k: i64 = 0 33 while k < pl { if buf[i + k] != pat[k] { return 0 } k = k + 1 } 34 return 1 35} 36 37// look up id (NUL-term) in the map buf; copy its marker to out; 1 found / 0 not 38func mm_lookup(mb: *u8, mn: i64, id: *u8, out: *u8, ocap: i64) -> i64 { 39 var ls: i64 = 0 40 var i: i64 = 0 41 while i <= mn { 42 var eol: i64 = 0 43 if i == mn { eol = 1 } else { if mb[i] == (10 as u8) { eol = 1 } } 44 if eol == 1 { 45 if mb[ls] != (35 as u8) { 46 // field 0 = id up to tab; compare to id 47 var mtch: i64 = 1 48 var k: i64 = 0 49 var p: i64 = ls 50 var go: i64 = 1 51 while go == 1 { 52 let c: i64 = id[k] as i64 53 if c == 0 { 54 if p < i { if mb[p] != (9 as u8) { mtch = 0 } } 55 go = 0 56 } else { 57 if p >= i { mtch = 0; go = 0 } else { 58 if mb[p] != id[k] { mtch = 0; go = 0 } 59 p = p + 1; k = k + 1 60 } 61 } 62 } 63 if mtch == 1 { 64 // marker = after the tab to eol 65 var q: i64 = p 66 if q < i { if mb[q] == (9 as u8) { q = q + 1 } } 67 var k2: i64 = 0 68 while q < i { if k2 < ocap - 1 { out[k2] = mb[q]; k2 = k2 + 1 } q = q + 1 } 69 out[k2] = 0 as u8 70 return 1 71 } 72 } 73 ls = i + 1 74 } 75 i = i + 1 76 } 77 return 0 78} 79 80func main() -> i64 { 81 let mb: *u8 = sys_mmap(K_MAGIC_131072) 82 let mn: i64 = mm_read("knowledge/registry/row_markers.tsv" as *u8, mb, K_MAGIC_131072) 83 if mn <= 0 { mm_w(1, "MARKMIGRATE verdict=GREEN applied=0 (no map)\n" as *u8); sys_exit(0) } 84 // ACQUIRE the SHARED queue lock around the whole read-modify-write of assignment_queue.tsv 85 // (serializes against nx_novel_close + the other writers); degrade-gracefully on giveup 86 // (-1 -> proceed unlocked, never wedge; O_EXCL stale-steal bounds a crashed holder to 30s). 87 let qlk: i64 = rt_lock("knowledge/registry/assignment_queue.tsv.lock" as *u8) 88 let qb: *u8 = sys_mmap(K_MAGIC_1048576) 89 let qn: i64 = mm_read("knowledge/registry/assignment_queue.tsv" as *u8, qb, K_MAGIC_1048576) 90 if qn <= 0 { if qlk >= 0 { rt_unlock("knowledge/registry/assignment_queue.tsv.lock" as *u8, qlk) } mm_w(1, "MARKMIGRATE verdict=RED reason=queue-missing\n" as *u8); sys_exit(101) } 91 let ob: *u8 = sys_mmap(K_MAGIC_1310720) 92 var on: i64 = 0 93 let id: *u8 = sys_mmap(64) 94 let mark: *u8 = sys_mmap(512) 95 var applied: i64 = 0 96 var ls: i64 = 0 97 var i: i64 = 0 98 while i <= qn { 99 var eol: i64 = 0 100 if i == qn { eol = 1 } else { if qb[i] == (10 as u8) { eol = 1 } } 101 if eol == 1 { 102 // copy line [ls, i) possibly with a marker inserted before the 8th tab 103 var changed: i64 = 0 104 if qb[ls] != (35 as u8) { 105 // extract id (field 0) 106 var k: i64 = 0 107 var p: i64 = ls 108 while p < i { if qb[p] == (9 as u8) { p = i } else { if k < 63 { id[k] = qb[p]; k = k + 1 } p = p + 1 } } 109 id[k] = 0 as u8 110 // already marked? 111 var hasmark: i64 = 0 112 var s: i64 = ls 113 while s < i { if mm_at(qb, qn, s, "||MARK=" as *u8, 7) == 1 { hasmark = 1; s = i } else { s = s + 1 } } 114 if hasmark == 0 { 115 if mm_lookup(mb, mn, id, mark, 512) == 1 { 116 // find 8th tab position in [ls,i) 117 var tabs: i64 = 0 118 var t8: i64 = 0 - 1 119 var q: i64 = ls 120 while q < i { if qb[q] == (9 as u8) { tabs = tabs + 1; if tabs == 8 { t8 = q; q = i } } q = q + 1 } 121 if t8 >= 0 { 122 // copy [ls, t8) + "||MARK=" + mark + [t8, i) 123 var a: i64 = ls 124 while a < t8 { ob[on] = qb[a]; on = on + 1; a = a + 1 } 125 let mkpfx: *u8 = "||MARK=" as *u8 126 var b: i64 = 0 127 while b < 7 { ob[on] = mkpfx[b]; on = on + 1; b = b + 1 } 128 var c: i64 = 0 129 while mark[c] != (0 as u8) { ob[on] = mark[c]; on = on + 1; c = c + 1 } 130 var d: i64 = t8 131 while d < i { ob[on] = qb[d]; on = on + 1; d = d + 1 } 132 changed = 1 133 applied = applied + 1 134 } 135 } 136 } 137 } 138 if changed == 0 { 139 var a2: i64 = ls 140 while a2 < i { ob[on] = qb[a2]; on = on + 1; a2 = a2 + 1 } 141 } 142 if i < qn { ob[on] = 10 as u8; on = on + 1 } 143 ls = i + 1 144 } 145 i = i + 1 146 } 147 if applied > 0 { 148 let wf: i64 = sys_openat_wr("knowledge/registry/assignment_queue.tsv" as *u8, 0x1a4) 149 if wf >= 0 { 150 var off: i64 = 0 151 while off < on { let w: i64 = sys_write(wf, ob + off, on - off); if w <= 0 { off = on } else { off = off + w } } 152 sys_close(wf) 153 } 154 } 155 if qlk >= 0 { rt_unlock("knowledge/registry/assignment_queue.tsv.lock" as *u8, qlk) } 156 let lf: i64 = sys_openat_append("knowledge/status/mark_migrate.log" as *u8, 0x1a4) 157 if lf >= 0 { mm_w(lf, "MARKMIGRATE applied=" as *u8); mm_wn(lf, applied); mm_w(lf, " epoch=" as *u8); mm_wn(lf, sys_now_realtime_sec()); mm_w(lf, " verdict=GREEN\n" as *u8); sys_close(lf) } 158 mm_w(1, "MARKMIGRATE applied=" as *u8); mm_wn(1, applied); mm_w(1, " (idempotent) verdict=GREEN\n" as *u8) 159 sys_exit(0) 160 return 0 161}