| avol[m5] = mapped(buf), m = LEB_SIZE, m0 = EB_PAGE_SIZE, sb = mksb(adr, m6, m5, m1, m2, m3, m4), m5 < # avol, ebm-vol-inv(avol), is-encoded(log0, buf) ⊦ ⟪log := []; err := ESUCCESS; logoff := 0; let buf = mkbuf(m0) in while err = ESUCCESS ∧ logoff < m do {/* (prepost-read-log : invariant logoff ≤ LEB_SIZE ∧ # buf = m0 ∧ is-aligned(logoff, m0) ∧ (err = ESUCCESS ∨ err = ENOENT ∨ ⌊err⌋ ) ∧ ebm-vol-inv(avol) ∧ sb.log < # avol ∧ avol[sb.log].mapped? ∧ (err = ESUCCESS → logoff ≤ # avol[sb.log].data ∧ is-encoded(log, subarray(avol[sb.log].data, 0, logoff))) ∧ (err = ENOENT → is-encoded(log, avol[sb.log].data)) wfbound LEB_SIZE - logoff) */; ebm_avol_read#(sb.log, logoff, 0, m0, avol; buf; err); if err = ESUCCESS then if isempty(buf) then err := ENOENT else let rnd = ? in {decode_ref_node#(m0, buf; rnd; err); if err = ESUCCESS then log := log + rnd.leb}; logoff := logoff + m0}; if err = ENOENT then err := ESUCCESS⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → log = log0)) |
avol[m5] = mapped(buf), m = LEB_SIZE, m0 = EB_PAGE_SIZE, sb = mksb(adr, m6, m5, m1, m2, m3, m4), m5 < # avol, ebm-vol-inv(avol), is-encoded(log0, buf) ⊦ ⟪err := ESUCCESS; logoff := 0; let buf = mkbuf(m0) in {log := []; while err = ESUCCESS ∧ logoff < m do {/* (prepost-read-log : invariant logoff ≤ LEB_SIZE ∧ # buf = m0 ∧ is-aligned(logoff, m0) ∧ (err = ESUCCESS ∨ err = ENOENT ∨ ⌊err⌋ ) ∧ ebm-vol-inv(avol) ∧ sb.log < # avol ∧ avol[sb.log].mapped? ∧ (err = ESUCCESS → logoff ≤ # avol[sb.log].data ∧ is-encoded(log, subarray(avol[sb.log].data, 0, logoff))) ∧ (err = ENOENT → is-encoded(log, avol[sb.log].data)) wfbound LEB_SIZE - logoff) */; ebm_avol_read#(sb.log, logoff, 0, m0, avol; buf; err); if err = ESUCCESS then if isempty(buf) then err := ENOENT else let rnd = ? in {decode_ref_node#(m0, buf; rnd; err); if err = ESUCCESS then log := log + rnd.leb}; logoff := logoff + m0}}; if err = ENOENT then err := ESUCCESS⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → log = log0))