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
open Testo_util
module T = Types
type timer = {
test: T.test;
worker: Multiprocess.Client.worker;
start_time: float;
max_duration: float;
}
type t = (string, timer) Hashtbl.t
let create () = Hashtbl.create 100
let add_test timers (test : T.test) worker =
match test.max_duration with
| None -> ()
| Some max_duration ->
let timer = {
test;
worker;
start_time = Unix.gettimeofday ();
max_duration;
} in
Hashtbl.replace timers test.id timer
let remove_test timers (test : T.test) =
Hashtbl.remove timers test.id
let remove_timeouts timers =
let now = Unix.gettimeofday () in
let timeouts =
Hashtbl.fold (fun _test_id timer acc ->
let elapsed = now -. timer.start_time in
if elapsed > timer.max_duration then
timer :: acc
else
acc
) timers []
in
List.iter (fun timer -> remove_test timers timer.test) timeouts;
Helpers.list_map (fun timer ->
(timer.test, timer.max_duration, timer.worker)
) timeouts