src/Pure/Concurrent/task_queue.ML
changeset 31638 fae680e35958
parent 31617 bb7b5a5942c7
child 31972 8c1b845ed105
     1.1 --- a/src/Pure/Concurrent/task_queue.ML	Sun Jun 14 23:24:38 2009 +0200
     1.2 +++ b/src/Pure/Concurrent/task_queue.ML	Sun Jun 14 23:25:49 2009 +0200
     1.3 @@ -21,7 +21,6 @@
     1.4    val is_empty: queue -> bool
     1.5    val enqueue: group -> task list -> int -> (bool -> bool) -> queue -> task * queue
     1.6    val extend: task -> (bool -> bool) -> queue -> queue option
     1.7 -  val depend: task list -> task -> queue -> queue
     1.8    val dequeue: queue -> (task * group * (bool -> bool) list) option * queue
     1.9    val interrupt: queue -> task -> unit
    1.10    val interrupt_external: queue -> string -> unit
    1.11 @@ -74,9 +73,6 @@
    1.12  fun add_job task dep (jobs: jobs) =
    1.13    Task_Graph.add_edge (dep, task) jobs handle Task_Graph.UNDEF _ => jobs;
    1.14  
    1.15 -fun add_job_acyclic task dep (jobs: jobs) =
    1.16 -  Task_Graph.add_edge_acyclic (dep, task) jobs handle Task_Graph.UNDEF _ => jobs;
    1.17 -
    1.18  
    1.19  (* queue of grouped jobs *)
    1.20  
    1.21 @@ -95,22 +91,25 @@
    1.22  
    1.23  (* enqueue *)
    1.24  
    1.25 -fun enqueue (group as Group (gid, _)) deps pri job (Queue {groups, jobs, ...}) =
    1.26 +fun enqueue (group as Group (gid, _)) deps pri job (Queue {groups, jobs, cache}) =
    1.27    let
    1.28      val task = new_task pri;
    1.29      val groups' = Inttab.cons_list (gid, task) groups;
    1.30      val jobs' = jobs
    1.31        |> Task_Graph.new_node (task, (group, Job [job])) |> fold (add_job task) deps;
    1.32 -  in (task, make_queue groups' jobs' Unknown) end;
    1.33 +    val cache' =
    1.34 +      (case cache of
    1.35 +        Result last =>
    1.36 +          if task_ord (last, task) = LESS
    1.37 +          then cache else Unknown
    1.38 +      | _ => Unknown);
    1.39 +  in (task, make_queue groups' jobs' cache') end;
    1.40  
    1.41  fun extend task job (Queue {groups, jobs, cache}) =
    1.42    (case try (get_job jobs) task of
    1.43      SOME (Job list) => SOME (make_queue groups (set_job task (Job (job :: list)) jobs) cache)
    1.44    | _ => NONE);
    1.45  
    1.46 -fun depend deps task (Queue {groups, jobs, ...}) =
    1.47 -  make_queue groups (fold (add_job_acyclic task) deps jobs) Unknown;
    1.48 -
    1.49  
    1.50  (* dequeue *)
    1.51  
    1.52 @@ -168,11 +167,14 @@
    1.53      val _ = List.app SimpleThread.interrupt running;
    1.54    in groups end;
    1.55  
    1.56 -fun finish task (Queue {groups, jobs, ...}) =
    1.57 +fun finish task (Queue {groups, jobs, cache}) =
    1.58    let
    1.59      val Group (gid, _) = get_group jobs task;
    1.60      val groups' = Inttab.remove_list (op =) (gid, task) groups;
    1.61      val jobs' = Task_Graph.del_node task jobs;
    1.62 -  in make_queue groups' jobs' Unknown end;
    1.63 +    val cache' =
    1.64 +      if null (Task_Graph.imm_succs jobs task) then cache
    1.65 +      else Unknown;
    1.66 +  in make_queue groups' jobs' cache' end;
    1.67  
    1.68  end;