src/Pure/Concurrent/task_queue.ML
changeset 47404 e6e5750f1311
parent 45642 65e4eeea09cd
child 47423 8a179a0493e3
equal deleted inserted replaced
47403:296b478df14e 47404:e6e5750f1311
    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) =