src/Pure/Concurrent/task_queue.ML
changeset 41708 d2e6b1132df2
parent 41702 dca4c58c5d57
child 41709 2e427f340ad1
equal deleted inserted replaced
41707:a10f0a1cae41 41708:d2e6b1132df2
    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);