24 val running: task -> (unit -> 'a) -> 'a |
24 val running: task -> (unit -> 'a) -> 'a |
25 val joining: task -> (unit -> 'a) -> 'a |
25 val joining: task -> (unit -> 'a) -> 'a |
26 val waiting: task -> task list -> (unit -> 'a) -> 'a |
26 val waiting: task -> task list -> (unit -> 'a) -> 'a |
27 type queue |
27 type queue |
28 val empty: queue |
28 val empty: queue |
|
29 val known_task: queue -> task -> bool |
29 val all_passive: queue -> bool |
30 val all_passive: queue -> bool |
30 val status: queue -> {ready: int, pending: int, running: int, passive: int} |
31 val status: queue -> {ready: int, pending: int, running: int, passive: int} |
31 val cancel: queue -> group -> bool |
32 val cancel: queue -> group -> bool |
32 val cancel_all: queue -> group list |
33 val cancel_all: queue -> group list |
33 val finish: task -> queue -> bool * queue |
34 val finish: task -> queue -> bool * queue |
34 val enqueue_passive: group -> (unit -> bool) -> queue -> task * queue |
35 val enqueue_passive: group -> (unit -> bool) -> queue -> task * queue |
35 val enqueue: string -> group -> task list -> int -> (bool -> bool) -> |
36 val enqueue: string -> group -> task list -> int -> (bool -> bool) -> queue -> task * queue |
36 queue -> (task * bool) * queue |
|
37 val extend: task -> (bool -> bool) -> queue -> queue option |
37 val extend: task -> (bool -> bool) -> queue -> queue option |
38 val dequeue_passive: Thread.thread -> task -> queue -> bool * queue |
38 val dequeue_passive: Thread.thread -> task -> queue -> bool * queue |
39 val dequeue: Thread.thread -> queue -> (task * (bool -> bool) list) option * queue |
39 val dequeue: Thread.thread -> queue -> (task * (bool -> bool) list) option * queue |
40 val dequeue_deps: Thread.thread -> task list -> queue -> |
40 val dequeue_deps: Thread.thread -> task list -> queue -> |
41 (((task * (bool -> bool) list) option * task list) * queue) |
41 (((task * (bool -> bool) list) option * task list) * queue) |
182 jobs: jobs}; (*job dependency graph*) |
182 jobs: jobs}; (*job dependency graph*) |
183 |
183 |
184 fun make_queue groups jobs = Queue {groups = groups, jobs = jobs}; |
184 fun make_queue groups jobs = Queue {groups = groups, jobs = jobs}; |
185 |
185 |
186 val empty = make_queue Inttab.empty Task_Graph.empty; |
186 val empty = make_queue Inttab.empty Task_Graph.empty; |
|
187 |
|
188 fun known_task (Queue {jobs, ...}) task = can (Task_Graph.get_entry jobs) task; |
187 |
189 |
188 |
190 |
189 (* job status *) |
191 (* job status *) |
190 |
192 |
191 fun ready_job task (Job list, ([], _)) = SOME (task, rev list) |
193 fun ready_job task (Job list, ([], _)) = SOME (task, rev list) |
274 val groups' = groups |
276 val groups' = groups |
275 |> fold (fn gid => Inttab.cons_list (gid, task)) (group_ancestry group); |
277 |> fold (fn gid => Inttab.cons_list (gid, task)) (group_ancestry group); |
276 val jobs' = jobs |
278 val jobs' = jobs |
277 |> Task_Graph.new_node (task, Job [job]) |
279 |> Task_Graph.new_node (task, Job [job]) |
278 |> fold (add_job task) deps; |
280 |> fold (add_job task) deps; |
279 val minimal = null (get_deps jobs' task); |
281 in (task, make_queue groups' jobs') end; |
280 in ((task, minimal), make_queue groups' jobs') end; |
|
281 |
282 |
282 fun extend task job (Queue {groups, jobs}) = |
283 fun extend task job (Queue {groups, jobs}) = |
283 (case try (get_job jobs) task of |
284 (case try (get_job jobs) task of |
284 SOME (Job list) => SOME (make_queue groups (set_job task (Job (job :: list)) jobs)) |
285 SOME (Job list) => SOME (make_queue groups (set_job task (Job (job :: list)) jobs)) |
285 | _ => NONE); |
286 | _ => NONE); |