8 sig |
8 sig |
9 type task |
9 type task |
10 val dummy_task: task |
10 val dummy_task: task |
11 val pri_of_task: task -> int |
11 val pri_of_task: task -> int |
12 val str_of_task: task -> string |
12 val str_of_task: task -> string |
13 val timing_of_task: task -> Time.time * Time.time |
13 val timing_of_task: task -> Time.time * Time.time * string list |
14 val running: task -> (unit -> 'a) -> 'a |
14 val running: task -> (unit -> 'a) -> 'a |
15 val joining: task -> (unit -> 'a) -> 'a |
15 val joining: task -> (unit -> 'a) -> 'a |
16 val waiting: task -> (unit -> 'a) -> 'a |
16 val waiting: task -> task list -> (unit -> 'a) -> 'a |
17 type group |
17 type group |
18 val new_group: group option -> group |
18 val new_group: group option -> group |
19 val group_id: group -> int |
19 val group_id: group -> int |
20 val eq_group: group * group -> bool |
20 val eq_group: group * group -> bool |
21 val cancel_group: group -> exn -> unit |
21 val cancel_group: group -> exn -> unit |
46 val new_id = Synchronized.counter (); |
46 val new_id = Synchronized.counter (); |
47 |
47 |
48 |
48 |
49 (* timing *) |
49 (* timing *) |
50 |
50 |
51 type timing = Time.time * Time.time; |
51 type timing = Time.time * Time.time * string list; |
52 |
52 |
53 fun new_timing () = |
53 fun new_timing () = |
54 Synchronized.var "timing" (Time.zeroTime, Time.zeroTime); |
54 Synchronized.var "timing" ((Time.zeroTime, Time.zeroTime, []): timing); |
55 |
55 |
56 fun gen_timing account timing e = |
56 fun gen_timing account timing e = |
57 let |
57 let |
58 val start = Time.now (); |
58 val start = Time.now (); |
59 val result = Exn.capture e (); |
59 val result = Exn.capture e (); |
78 fun str_of_task (Task {name, id, ...}) = |
78 fun str_of_task (Task {name, id, ...}) = |
79 if name = "" then string_of_int id else string_of_int id ^ " (" ^ name ^ ")"; |
79 if name = "" then string_of_int id else string_of_int id ^ " (" ^ name ^ ")"; |
80 |
80 |
81 fun timing_of_task (Task {timing, ...}) = Synchronized.value timing; |
81 fun timing_of_task (Task {timing, ...}) = Synchronized.value timing; |
82 |
82 |
83 fun running (Task {timing, ...}) = gen_timing (fn t => fn (a, b) => (Time.+ (a, t), b)) timing; |
83 fun running (Task {timing, ...}) = |
84 fun joining (Task {timing, ...}) = gen_timing (fn t => fn (a, b) => (Time.- (a, t), b)) timing; |
84 gen_timing (fn t => fn (a, b, ds) => (Time.+ (a, t), b, ds)) timing; |
85 fun waiting (Task {timing, ...}) = |
85 |
86 gen_timing (fn t => fn (a, b) => (Time.- (a, t), Time.+ (b, t))) timing; |
86 fun joining (Task {timing, ...}) = |
|
87 gen_timing (fn t => fn (a, b, ds) => (Time.- (a, t), b, ds)) timing; |
|
88 |
|
89 fun waiting (Task {timing, ...}) deps = |
|
90 timing |> gen_timing (fn t => fn (a, b, ds) => |
|
91 (Time.- (a, t), Time.+ (b, t), fold (fn Task {name, ...} => insert (op =) name) deps ds)); |
87 |
92 |
88 fun task_ord (Task {id = id1, pri = pri1, ...}, Task {id = id2, pri = pri2, ...}) = |
93 fun task_ord (Task {id = id1, pri = pri1, ...}, Task {id = id2, pri = pri2, ...}) = |
89 prod_ord (rev_order o option_ord int_ord) int_ord ((pri1, id1), (pri2, id2)); |
94 prod_ord (rev_order o option_ord int_ord) int_ord ((pri1, id1), (pri2, id2)); |
90 |
95 |
91 val eq_task = is_equal o task_ord; |
96 val eq_task = is_equal o task_ord; |