static dummy_task (again) to avoid a few extra allocations;
authorwenzelm
Thu, 13 Oct 2011 22:50:35 +0200
changeset 460072afb928c71ca
parent 46006 5ba2f065c6f7
child 46008 6e422d180de8
static dummy_task (again) to avoid a few extra allocations;
src/Pure/Concurrent/future.ML
src/Pure/Concurrent/task_queue.ML
     1.1 --- a/src/Pure/Concurrent/future.ML	Thu Oct 13 13:49:55 2011 +0200
     1.2 +++ b/src/Pure/Concurrent/future.ML	Thu Oct 13 22:50:35 2011 +0200
     1.3 @@ -552,7 +552,7 @@
     1.4  
     1.5  fun value_result (res: 'a Exn.result) =
     1.6    let
     1.7 -    val task = Task_Queue.dummy_task ();
     1.8 +    val task = Task_Queue.dummy_task;
     1.9      val group = Task_Queue.group_of_task task;
    1.10      val result = Single_Assignment.var "value" : 'a result;
    1.11      val _ = assign_result group result res;
     2.1 --- a/src/Pure/Concurrent/task_queue.ML	Thu Oct 13 13:49:55 2011 +0200
     2.2 +++ b/src/Pure/Concurrent/task_queue.ML	Thu Oct 13 22:50:35 2011 +0200
     2.3 @@ -16,7 +16,7 @@
     2.4    val str_of_group: group -> string
     2.5    val str_of_groups: group -> string
     2.6    type task
     2.7 -  val dummy_task: unit -> task
     2.8 +  val dummy_task: task
     2.9    val group_of_task: task -> group
    2.10    val name_of_task: task -> string
    2.11    val pri_of_task: task -> int
    2.12 @@ -102,22 +102,23 @@
    2.13  
    2.14  type timing = Time.time * Time.time * string list;  (*run, wait, wait dependencies*)
    2.15  
    2.16 -fun new_timing () =
    2.17 -  Synchronized.var "timing" ((Time.zeroTime, Time.zeroTime, []): timing);
    2.18 +val timing_start = (Time.zeroTime, Time.zeroTime, []): timing;
    2.19 +
    2.20 +fun new_timing () = Synchronized.var "timing" timing_start;
    2.21  
    2.22  abstype task = Task of
    2.23   {group: group,
    2.24    name: string,
    2.25    id: int,
    2.26    pri: int option,
    2.27 -  timing: timing Synchronized.var}
    2.28 +  timing: timing Synchronized.var option}
    2.29  with
    2.30  
    2.31 -fun dummy_task () =
    2.32 -  Task {group = new_group NONE, name = "", id = 0, pri = NONE, timing = new_timing ()};
    2.33 +val dummy_task =
    2.34 +  Task {group = new_group NONE, name = "", id = 0, pri = NONE, timing = NONE};
    2.35  
    2.36  fun new_task group name pri =
    2.37 -  Task {group = group, name = name, id = new_id (), pri = pri, timing = new_timing ()};
    2.38 +  Task {group = group, name = name, id = new_id (), pri = pri, timing = SOME (new_timing ())};
    2.39  
    2.40  fun group_of_task (Task {group, ...}) = group;
    2.41  fun name_of_task (Task {name, ...}) = name;
    2.42 @@ -128,7 +129,8 @@
    2.43  
    2.44  fun str_of_task_groups task = str_of_task task ^ " in " ^ str_of_groups (group_of_task task);
    2.45  
    2.46 -fun timing_of_task (Task {timing, ...}) = Synchronized.value timing;
    2.47 +fun timing_of_task (Task {timing, ...}) =
    2.48 +  (case timing of NONE => timing_start | SOME var => Synchronized.value var);
    2.49  
    2.50  fun update_timing update (Task {timing, ...}) e =
    2.51    uninterruptible (fn restore_attributes => fn () =>
    2.52 @@ -136,7 +138,7 @@
    2.53        val start = Time.now ();
    2.54        val result = Exn.capture (restore_attributes e) ();
    2.55        val t = Time.- (Time.now (), start);
    2.56 -      val _ = Synchronized.change timing (update t);
    2.57 +      val _ = (case timing of NONE => () | SOME var => Synchronized.change var (update t));
    2.58      in Exn.release result end) ();
    2.59  
    2.60  fun task_ord (Task {id = id1, pri = pri1, ...}, Task {id = id2, pri = pri2, ...}) =