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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
let enabled = ref false
let enable () = enabled := true
let disable () = enabled := false
type period = {
name : string;
mutable prev : int;
nb : int array;
dt : float array;
}
type t = {
first : float;
mutable last : float;
minutes : period;
hours : period;
days : period;
all : period;
}
let forward_period p pos =
let size = Array.length p.nb in
if pos - p.prev > size then begin
Array.fill p.nb 0 size 0;
Array.fill p.dt 0 size 0.;
p.prev <- pos
end
else begin
let rec iter p pos size =
if pos > p.prev then
let new_prev = p.prev+1 in
p.prev <- new_prev;
let n = new_prev mod size in
p.nb.(n) <- 0;
p.dt.(n) <- 0.;
iter p pos size
in
iter p pos size
end;
pos mod size
let add_period p pos dt =
try
let pos = forward_period p pos in
p.nb.(pos) <- p.nb.(pos) + 1;
p.dt.(pos) <- p.dt.(pos) +. dt
with exn ->
Printf.eprintf "Timings: exn %s discarded\n%!"
(Printexc.to_string exn)
let add t t1 dt =
let second = int_of_float (t1 -. t.first) in
let minute = second / 60 in
let hour = minute / 60 in
let day = hour / 24 in
add_period t.minutes minute dt;
add_period t.hours hour dt;
add_period t.days day dt;
add_period t.all 0 dt;
t.last <- t1;
()
let create_period name n =
{
name;
prev = 0;
nb = Array.make n 0;
dt = Array.make n 0.;
}
let copy_period p pos =
let size = Array.length p.nb in
let p2 = create_period p.name size in
for i = 0 to size - 1 do
let n = (size+pos-i) mod size in
p2.nb.(i) <- p.nb.(n);
p2.dt.(i) <- p.dt.(n);
done;
p2
let create first =
{
first; last = first;
minutes = create_period "minutes" 60;
hours = create_period "hours" 24;
days = create_period "days" 30;
all = create_period "all" 1;
}
let get t1 t =
let second = int_of_float (t1 -. t.first) in
let minute = second / 60 in
let hour = minute / 60 in
let day = hour / 24 in
ignore (forward_period t.minutes minute : int);
ignore (forward_period t.hours hour : int);
ignore (forward_period t.days day : int);
{ t with
minutes = copy_period t.minutes minute;
hours = copy_period t.hours hour;
days = copy_period t.days day;
}
type timings = {
mutable timings_ok : t array;
mutable timings_fail : t array;
}
let timings = {
timings_ok = [||];
timings_fail = [||];
}
let add_timing n ok t dt =
if ok then try add timings.timings_ok.(n) t dt with _ -> ()
else try add timings.timings_fail.(n) t dt with _ -> ()
let init t0 nservices =
timings.timings_ok <- Array.init nservices (fun _ -> create t0);
timings.timings_fail <- Array.init nservices (fun _ -> create t0)