src/Pure/Concurrent/task_queue.ML
changeset 41680 a4c822915eaa
parent 41679 79716cb61bfd
child 41681 b5d7b15166bf
equal deleted inserted replaced
41679:79716cb61bfd 41680:a4c822915eaa
     8 sig
     8 sig
     9   type task
     9   type task
    10   val dummy_task: task
    10   val dummy_task: task
    11   val pri_of_task: task -> int
    11   val pri_of_task: task -> int
    12   val str_of_task: task -> string
    12   val str_of_task: task -> string
    13   val timing_of_task: task -> Time.time * Time.time
    13   val timing_of_task: task -> Time.time * Time.time * string list
    14   val running: task -> (unit -> 'a) -> 'a
    14   val running: task -> (unit -> 'a) -> 'a
    15   val joining: task -> (unit -> 'a) -> 'a
    15   val joining: task -> (unit -> 'a) -> 'a
    16   val waiting: task -> (unit -> 'a) -> 'a
    16   val waiting: task -> task list -> (unit -> 'a) -> 'a
    17   type group
    17   type group
    18   val new_group: group option -> group
    18   val new_group: group option -> group
    19   val group_id: group -> int
    19   val group_id: group -> int
    20   val eq_group: group * group -> bool
    20   val eq_group: group * group -> bool
    21   val cancel_group: group -> exn -> unit
    21   val cancel_group: group -> exn -> unit
    46 val new_id = Synchronized.counter ();
    46 val new_id = Synchronized.counter ();
    47 
    47 
    48 
    48 
    49 (* timing *)
    49 (* timing *)
    50 
    50 
    51 type timing = Time.time * Time.time;
    51 type timing = Time.time * Time.time * string list;
    52 
    52 
    53 fun new_timing () =
    53 fun new_timing () =
    54   Synchronized.var "timing" (Time.zeroTime, Time.zeroTime);
    54   Synchronized.var "timing" ((Time.zeroTime, Time.zeroTime, []): timing);
    55 
    55 
    56 fun gen_timing account timing e =
    56 fun gen_timing account timing e =
    57   let
    57   let
    58     val start = Time.now ();
    58     val start = Time.now ();
    59     val result = Exn.capture e ();
    59     val result = Exn.capture e ();
    78 fun str_of_task (Task {name, id, ...}) =
    78 fun str_of_task (Task {name, id, ...}) =
    79   if name = "" then string_of_int id else string_of_int id ^ " (" ^ name ^ ")";
    79   if name = "" then string_of_int id else string_of_int id ^ " (" ^ name ^ ")";
    80 
    80 
    81 fun timing_of_task (Task {timing, ...}) = Synchronized.value timing;
    81 fun timing_of_task (Task {timing, ...}) = Synchronized.value timing;
    82 
    82 
    83 fun running (Task {timing, ...}) = gen_timing (fn t => fn (a, b) => (Time.+ (a, t), b)) timing;
    83 fun running (Task {timing, ...}) =
    84 fun joining (Task {timing, ...}) = gen_timing (fn t => fn (a, b) => (Time.- (a, t), b)) timing;
    84   gen_timing (fn t => fn (a, b, ds) => (Time.+ (a, t), b, ds)) timing;
    85 fun waiting (Task {timing, ...}) =
    85 
    86   gen_timing (fn t => fn (a, b) => (Time.- (a, t), Time.+ (b, t))) timing;
    86 fun joining (Task {timing, ...}) =
       
    87   gen_timing (fn t => fn (a, b, ds) => (Time.- (a, t), b, ds)) timing;
       
    88 
       
    89 fun waiting (Task {timing, ...}) deps =
       
    90   timing |> gen_timing (fn t => fn (a, b, ds) =>
       
    91     (Time.- (a, t), Time.+ (b, t), fold (fn Task {name, ...} => insert (op =) name) deps ds));
    87 
    92 
    88 fun task_ord (Task {id = id1, pri = pri1, ...}, Task {id = id2, pri = pri2, ...}) =
    93 fun task_ord (Task {id = id1, pri = pri1, ...}, Task {id = id2, pri = pri2, ...}) =
    89   prod_ord (rev_order o option_ord int_ord) int_ord ((pri1, id1), (pri2, id2));
    94   prod_ord (rev_order o option_ord int_ord) int_ord ((pri1, id1), (pri2, id2));
    90 
    95 
    91 val eq_task = is_equal o task_ord;
    96 val eq_task = is_equal o task_ord;