| persistence_io_read_log#(SB, PAGESIZE, LEBSIZE, AVOL; LOGOFF; LOG, ERR) {LOG := []; ERR := ESUCCESS; LOGOFF := 0; let BUF = mkbuf(PAGESIZE) in while ERR = ESUCCESS ∧ LOGOFF < LEBSIZE do {/* (prepost-read-log : invariant LOGOFF ≤ LEB_SIZE ∧ # BUF = PAGESIZE ∧ is-aligned(LOGOFF, PAGESIZE) ∧ (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, PAGESIZE, AVOL; BUF; ERR); if ERR = ESUCCESS then if isempty(BUF) then ERR := ENOENT else let RND = ? in {decode_ref_node#(PAGESIZE, BUF; RND; ERR); if ERR = ESUCCESS then LOG := LOG + RND.leb}; LOGOFF := LOGOFF + PAGESIZE}; if ERR = ENOENT then ERR := ESUCCESS } |