26 val running: task -> (unit -> 'a) -> 'a |
26 val running: task -> (unit -> 'a) -> 'a |
27 val joining: task -> (unit -> 'a) -> 'a |
27 val joining: task -> (unit -> 'a) -> 'a |
28 val waiting: task -> task list -> (unit -> 'a) -> 'a |
28 val waiting: task -> task list -> (unit -> 'a) -> 'a |
29 type queue |
29 type queue |
30 val empty: queue |
30 val empty: queue |
|
31 val group_tasks: queue -> group -> task list |
31 val known_task: queue -> task -> bool |
32 val known_task: queue -> task -> bool |
32 val all_passive: queue -> bool |
33 val all_passive: queue -> bool |
33 val status: queue -> {ready: int, pending: int, running: int, passive: int} |
34 val status: queue -> {ready: int, pending: int, running: int, passive: int} |
34 val cancel: queue -> group -> task list * Thread.thread list |
35 val cancel: queue -> group -> Thread.thread list |
35 val cancel_all: queue -> group list * Thread.thread list |
36 val cancel_all: queue -> group list * Thread.thread list |
36 val finish: task -> queue -> bool * queue |
37 val finish: task -> queue -> bool * queue |
37 val enqueue_passive: group -> (unit -> bool) -> queue -> task * queue |
38 val enqueue_passive: group -> (unit -> bool) -> queue -> task * queue |
38 val enqueue: string -> group -> task list -> int -> (bool -> bool) -> queue -> task * queue |
39 val enqueue: string -> group -> task list -> int -> (bool -> bool) -> queue -> task * queue |
39 val extend: task -> (bool -> bool) -> queue -> queue option |
40 val extend: task -> (bool -> bool) -> queue -> queue option |
208 datatype queue = Queue of {groups: groups, jobs: jobs}; |
209 datatype queue = Queue of {groups: groups, jobs: jobs}; |
209 |
210 |
210 fun make_queue groups jobs = Queue {groups = groups, jobs = jobs}; |
211 fun make_queue groups jobs = Queue {groups = groups, jobs = jobs}; |
211 val empty = make_queue Inttab.empty Task_Graph.empty; |
212 val empty = make_queue Inttab.empty Task_Graph.empty; |
212 |
213 |
|
214 fun group_tasks (Queue {groups, ...}) group = Tasks.keys (get_tasks groups (group_id group)); |
213 fun known_task (Queue {jobs, ...}) task = can (Task_Graph.get_entry jobs) task; |
215 fun known_task (Queue {jobs, ...}) task = can (Task_Graph.get_entry jobs) task; |
214 |
216 |
215 |
217 |
216 (* job status *) |
218 (* job status *) |
217 |
219 |
252 |
254 |
253 fun cancel (Queue {groups, jobs}) group = |
255 fun cancel (Queue {groups, jobs}) group = |
254 let |
256 let |
255 val _ = cancel_group group Exn.Interrupt; |
257 val _ = cancel_group group Exn.Interrupt; |
256 val running = |
258 val running = |
257 Tasks.fold (fn (task, _) => fn (tasks, threads) => |
259 Tasks.fold (fn (task, _) => |
258 (case get_job jobs task of |
260 (case get_job jobs task of Running thread => insert Thread.equal thread | _ => I)) |
259 Running thread => (task :: tasks, insert Thread.equal thread threads) |
261 (get_tasks groups (group_id group)) []; |
260 | Passive _ => (task :: tasks, threads) |
|
261 | _ => (tasks, threads))) |
|
262 (get_tasks groups (group_id group)) ([], []); |
|
263 in running end; |
262 in running end; |
264 |
263 |
265 fun cancel_all (Queue {jobs, ...}) = |
264 fun cancel_all (Queue {jobs, ...}) = |
266 let |
265 let |
267 fun cancel_job (task, (job, _)) (groups, running) = |
266 fun cancel_job (task, (job, _)) (groups, running) = |