209 fun known_task (Queue {jobs, ...}) task = can (Task_Graph.get_entry jobs) task; |
209 fun known_task (Queue {jobs, ...}) task = can (Task_Graph.get_entry jobs) task; |
210 |
210 |
211 |
211 |
212 (* job status *) |
212 (* job status *) |
213 |
213 |
214 fun ready_job task (Job list, ([], _)) = SOME (task, rev list) |
214 fun ready_job task (Job list, (deps, _)) = |
215 | ready_job task (Passive abort, ([], _)) = |
215 if Task_Graph.Keys.is_empty deps then SOME (task, rev list) else NONE |
216 if is_canceled (group_of_task task) then SOME (task, [fn _ => abort ()]) |
216 | ready_job task (Passive abort, (deps, _)) = |
|
217 if Task_Graph.Keys.is_empty deps andalso is_canceled (group_of_task task) |
|
218 then SOME (task, [fn _ => abort ()]) |
217 else NONE |
219 else NONE |
218 | ready_job _ _ = NONE; |
220 | ready_job _ _ = NONE; |
219 |
221 |
220 fun active_job (_, (Job _, _)) = SOME () |
222 fun active_job (_, (Job _, _)) = SOME () |
221 | active_job (_, (Running _, _)) = SOME () |
223 | active_job (_, (Running _, _)) = SOME () |
230 fun status (Queue {jobs, ...}) = |
232 fun status (Queue {jobs, ...}) = |
231 let |
233 let |
232 val (x, y, z, w) = |
234 val (x, y, z, w) = |
233 Task_Graph.fold (fn (_, (job, (deps, _))) => fn (x, y, z, w) => |
235 Task_Graph.fold (fn (_, (job, (deps, _))) => fn (x, y, z, w) => |
234 (case job of |
236 (case job of |
235 Job _ => if null deps then (x + 1, y, z, w) else (x, y + 1, z, w) |
237 Job _ => if Task_Graph.Keys.is_empty deps then (x + 1, y, z, w) else (x, y + 1, z, w) |
236 | Running _ => (x, y, z + 1, w) |
238 | Running _ => (x, y, z + 1, w) |
237 | Passive _ => (x, y, z, w + 1))) |
239 | Passive _ => (x, y, z, w + 1))) |
238 jobs (0, 0, 0, 0); |
240 jobs (0, 0, 0, 0); |
239 in {ready = x, pending = y, running = z, passive = w} end; |
241 in {ready = x, pending = y, running = z, passive = w} end; |
240 |
242 |
276 fun finish task (Queue {groups, jobs}) = |
278 fun finish task (Queue {groups, jobs}) = |
277 let |
279 let |
278 val group = group_of_task task; |
280 val group = group_of_task task; |
279 val groups' = fold_groups (fn g => del_task (group_id g, task)) group groups; |
281 val groups' = fold_groups (fn g => del_task (group_id g, task)) group groups; |
280 val jobs' = Task_Graph.del_node task jobs; |
282 val jobs' = Task_Graph.del_node task jobs; |
281 val maximal = null (Task_Graph.imm_succs jobs task); |
283 val maximal = Task_Graph.is_maximal jobs task; |
282 in (maximal, make_queue groups' jobs') end; |
284 in (maximal, make_queue groups' jobs') end; |
283 |
285 |
284 |
286 |
285 (* enqueue *) |
287 (* enqueue *) |
286 |
288 |
340 | ready_dep seen (task :: tasks) = |
342 | ready_dep seen (task :: tasks) = |
341 if Tasks.defined seen task then ready_dep seen tasks |
343 if Tasks.defined seen task then ready_dep seen tasks |
342 else |
344 else |
343 let val entry as (_, (ds, _)) = #2 (Task_Graph.get_entry jobs task) in |
345 let val entry as (_, (ds, _)) = #2 (Task_Graph.get_entry jobs task) in |
344 (case ready_job task entry of |
346 (case ready_job task entry of |
345 NONE => ready_dep (Tasks.update (task, ()) seen) (ds @ tasks) |
347 NONE => ready_dep (Tasks.update (task, ()) seen) (Task_Graph.Keys.dest ds @ tasks) |
346 | some => some) |
348 | some => some) |
347 end; |
349 end; |
348 |
350 |
349 fun result (res as (task, _)) deps' = |
351 fun result (res as (task, _)) deps' = |
350 let val jobs' = set_job task (Running thread) jobs |
352 let val jobs' = set_job task (Running thread) jobs |