diff --git a/src/vmm_ring.ml b/src/vmm_ring.ml index 90ca65f..26ec4df 100644 --- a/src/vmm_ring.ml +++ b/src/vmm_ring.ml @@ -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) []