vmm_ring revise implementation

This commit is contained in:
Hannes Mehnert 2019-10-29 20:31:25 +01:00
parent 8a113e5ce0
commit ec9f00b39a
1 changed files with 24 additions and 17 deletions

View File

@ -19,30 +19,37 @@ let write t entry =
let dec t n = (pred n + t.size) mod t.size
let get_valid t idx =
let our = Array.get t.data idx in
if Ptime.equal (fst our) Ptime.min then
None
else
Some our
let read_last t ?(tst = fun _ -> true) n =
let rec one idx count acc =
let our = Array.get t.data idx in
if tst (snd our) then
if pred count = 0 then
our :: acc
else
one (dec t idx) (pred count) (our :: acc)
else
one (dec t idx) count acc
if count = 0 then
acc
else match get_valid t idx with
| None -> acc
| Some our ->
if tst (snd our) then
one (dec t idx) (pred count) (our :: acc)
else
one (dec t idx) count acc
in
one (dec t t.write) n []
let read_history t ?(tst = fun _ -> true) since =
let rec go acc idx =
let entry = Array.get t.data idx in
if Ptime.equal (fst entry) Ptime.min then
acc
else if tst (snd entry) then
let rec go idx acc =
match get_valid t idx with
| None -> acc
| Some entry ->
if Ptime.is_earlier (fst entry) ~than:since then
acc
else if tst (snd entry) then
go (dec t idx) (entry :: acc)
else
go (entry :: acc) (dec t idx)
else
go acc (dec t idx)
go (dec t idx) acc
in
go [] (dec t t.write)
go (dec t t.write) []