Source file interval_limiter.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type t = {
min_interval: Mtime.span Atomic.t;
last: Mtime.t Atomic.t;
}
let[@inline] min_interval self = Atomic.get self.min_interval
let[@inline] set_min_interval self i = Atomic.set self.min_interval i
let create_atomic ~min_interval () : t =
{ min_interval; last = Atomic.make Mtime.min_stamp }
let create ~min_interval () : t =
create_atomic ~min_interval:(Atomic.make min_interval) ()
let make_attempt (self : t) : bool =
let now = Mtime_clock.now () in
let last = Atomic.get self.last in
let elapsed = Mtime.span last now in
if Mtime.Span.compare elapsed (Atomic.get self.min_interval) >= 0 then
Atomic.compare_and_set self.last last now
else
false