| jvalid1 ↔ jvalid3, jvalid0 ↔ jvalid4, jvalid ↔ jvalid2, jro = jro0, remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ jro0, fi0.inos < pmaxino, fi.inos < jmaxino, p_os < pmaxino, jro1 < jmaxino, inv(gstore0), inv(gstore \ jro0), refsize-cons(gstore0, range fi0), refsize-cons(gstore, range fi), ri-cons(fi, nodes(gstore ↓, jro0)), ri-inj(fi0), ri-inj(fi), pmaxino ≤ jmaxino, fi0.lebs ⊆ dom gstore0, fi.lebs ⊆ dom gstore, jvalid4 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ ⟪if ri-cons(fi, nodes(gstore ↓, jro)) then let lnum = ?, err = ? in {index_get_gc_block#(fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; lnum; err); if err = ESUCCESS then let n = ? in {debug#("gjournal: garbage collecting LEB " + lnum.toString); index_get_gblock_refsize#(lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; ; n); if n ≠ 0 then let ax = [], gndx = [], ndx = [] in {index_read_gblock_nodes#(lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; ax, gndx; err); if err ≠ ESUCCESS then debug#("gjournal: failed to read LEB " + lnum.toString + " during GC") else gjournal_gc_referenced_nodes# (lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; ax, gndx; ndx, err); if err = ESUCCESS then {gjournal_gc_copy# (jvalid1, fi0, gstore0, pmaxino, p_os; ndx, jvalid0, jmaxino0, jmaxino, fi, jro, gstore, nx, jvalid; err); if err ≠ ESUCCESS then debug#("gjournal: failed to copy nodes of LEB " + lnum.toString + " to journal head during GC")}}}; if err = ESUCCESS then index_sync#(fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os; ; jvalid, err); if err = ESUCCESS then index_deallocate_gnd#(lnum, fi, fi0, gstore0, nx, pmaxino, p_os, jvalid; jro, gstore; err)} else abort⟫ ( jro1 < jmaxino ∧ pmaxino ≤ jmaxino ∧ fi.inos < jmaxino ∧ jmaxino ≠ 0 ∧ (jvalid0 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro)) ∧ fi.lebs ⊆ dom gstore ∧ refsize-cons(gstore, range fi) ∧ inv(gstore \ jro) ∧ elems nx ∩ jro = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro ∧ ri-inj(fi)), jmaxino = 0, pmaxino = 0, dups(nx) |
jvalid ↔ jvalid2, jvalid0 ↔ jvalid4, jvalid1 ↔ jvalid3, jro = jro0, remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ jro0, jro1 < jmaxino, p_os < pmaxino, fi.inos < jmaxino, fi0.inos < pmaxino, inv(gstore \ jro0), inv(gstore0), refsize-cons(gstore, range fi), refsize-cons(gstore0, range fi0), ri-cons(fi, nodes(gstore ↓, jro0)), ri-inj(fi), ri-inj(fi0), pmaxino ≤ jmaxino, fi.lebs ⊆ dom gstore, fi0.lebs ⊆ dom gstore0, jvalid4 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ ⟪let lnum = ?, err = ? in {index_get_gc_block#(fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; lnum; err); if err = ESUCCESS then let n = ? in {debug#("gjournal: garbage collecting LEB " + lnum.toString); index_get_gblock_refsize#(lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; ; n); if n ≠ 0 then let ax = [], gndx = [], ndx = [] in {index_read_gblock_nodes#(lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; ax, gndx; err); if err ≠ ESUCCESS then debug#("gjournal: failed to read LEB " + lnum.toString + " during GC") else gjournal_gc_referenced_nodes#(lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid; ax, gndx; ndx, err); if err = ESUCCESS then {gjournal_gc_copy# (jvalid1, fi0, gstore0, pmaxino, p_os; ndx, jvalid0, jmaxino0, jmaxino, fi, jro, gstore, nx, jvalid; err); if err ≠ ESUCCESS then debug#("gjournal: failed to copy nodes of LEB " + lnum.toString + " to journal head during GC")}}}; if err = ESUCCESS then index_sync#(fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os; ; jvalid, err); if err = ESUCCESS then index_deallocate_gnd#(lnum, fi, fi0, gstore0, nx, pmaxino, p_os, jvalid; jro, gstore; err)}⟫ ( jro1 < jmaxino ∧ pmaxino ≤ jmaxino ∧ fi.inos < jmaxino ∧ jmaxino ≠ 0 ∧ (jvalid0 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro)) ∧ fi.lebs ⊆ dom gstore ∧ refsize-cons(gstore, range fi) ∧ inv(gstore \ jro) ∧ elems nx ∩ jro = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro ∧ ri-inj(fi)), jmaxino = 0, pmaxino = 0, dups(nx)
Used simplifier rules: ⊦ ri-cons(ri, fs) → ( ri-cons(ri0, fs0) ↔ (∀ key. (key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]])) → key ∈ ri0 → ri0[key] ∈ fs0 ∧ key-cons(key, fs0[ri0[key]]))); (ss)