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