@@ -33,31 +33,23 @@ let (queue : t Ipq.t) = Ipq.create 50 queue_default
33
33
34
34
let lock = Mutex. create ()
35
35
36
- module Clock = struct
37
- let span s = Mtime.Span. of_uint64_ns (Int64. of_float (s *. 1e9 ))
38
-
39
- let span_to_s span =
40
- Mtime.Span. to_uint64_ns span |> Int64. to_float |> fun ns -> ns /. 1e9
41
-
42
- let add_span clock secs =
43
- (* return mix or max available value if the add overflows *)
44
- match Mtime. add_span clock (span secs) with
45
- | Some t ->
46
- t
47
- | None when secs > 0. ->
48
- Mtime. max_stamp
49
- | None ->
50
- Mtime. min_stamp
51
- end
52
-
53
- let add_to_queue name ty start newfunc =
54
- let ( ++ ) = Clock. add_span in
36
+ let add_to_queue_span name ty start_span newfunc =
37
+ let ( ++ ) = Mtime.Span. add in
55
38
let item =
56
- {Ipq. ev= {func= newfunc; ty; name}; Ipq. time= Mtime_clock. now () ++ start}
39
+ {
40
+ Ipq. ev= {func= newfunc; ty; name}
41
+ ; Ipq. time= Mtime_clock. elapsed () ++ start_span
42
+ }
57
43
in
58
44
with_lock lock (fun () -> Ipq. add queue item) ;
59
45
Delay. signal delay
60
46
47
+ let add_to_queue name ty start newfunc =
48
+ let start_span =
49
+ Clock.Timer. s_to_span start |> Option. value ~default: Mtime.Span. max_span
50
+ in
51
+ add_to_queue_span name ty start_span newfunc
52
+
61
53
let remove_from_queue name =
62
54
with_lock lock @@ fun () ->
63
55
match ! pending_event with
@@ -72,8 +64,11 @@ let add_periodic_pending () =
72
64
with_lock lock @@ fun () ->
73
65
match ! pending_event with
74
66
| Some ({ty = Periodic timer ; _} as ev ) ->
75
- let ( ++ ) = Clock. add_span in
76
- let item = {Ipq. ev; Ipq. time= Mtime_clock. now () ++ timer} in
67
+ let ( ++ ) = Mtime.Span. add in
68
+ let delta =
69
+ Clock.Timer. s_to_span timer |> Option. value ~default: Mtime.Span. max_span
70
+ in
71
+ let item = {Ipq. ev; Ipq. time= Mtime_clock. elapsed () ++ delta} in
77
72
Ipq. add queue item ;
78
73
pending_event := None
79
74
| Some {ty = OneShot ; _} ->
@@ -85,15 +80,15 @@ let loop () =
85
80
debug " %s started" __MODULE__ ;
86
81
try
87
82
while true do
88
- let now = Mtime_clock. now () in
83
+ let now = Mtime_clock. elapsed () in
89
84
let deadline, item =
90
85
with_lock lock @@ fun () ->
91
86
(* empty: wait till we get something *)
92
87
if Ipq. is_empty queue then
93
- (Clock. add_span now 10.0 , None )
88
+ (Mtime.Span. add now Mtime.Span. ( 10 * s) , None )
94
89
else
95
90
let next = Ipq. maximum queue in
96
- if Mtime. is_later next.Ipq. time ~than: now then
91
+ if Mtime.Span. is_longer next.Ipq. time ~than: now then
97
92
(* not expired: wait till time or interrupted *)
98
93
(next.Ipq. time, None )
99
94
else (
@@ -111,7 +106,9 @@ let loop () =
111
106
| None -> (
112
107
(* Sleep until next event. *)
113
108
let sleep =
114
- Mtime. (span deadline now) |> Mtime.Span. (add ms) |> Clock. span_to_s
109
+ Mtime. (Span. abs_diff deadline now)
110
+ |> Mtime.Span. (add ms)
111
+ |> Clock.Timer. span_to_s
115
112
in
116
113
try ignore (Delay. wait delay sleep)
117
114
with e ->
0 commit comments