src/Pure/Concurrent/task_queue.ML
changeset 44338 700008399ee5
parent 44299 061599cb6eb0
child 44340 3b859b573f1a
equal deleted inserted replaced
44337:d453faed4815 44338:700008399ee5
   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