tuned signature;
authorwenzelm
Wed, 06 Nov 2013 20:46:00 +0100
changeset 552577bf7b2903fb9
parent 55256 36dc6aa4fe87
child 55258 39ac1a02c60c
tuned signature;
src/Pure/Concurrent/future.ML
     1.1 --- a/src/Pure/Concurrent/future.ML	Wed Nov 06 18:15:25 2013 +0100
     1.2 +++ b/src/Pure/Concurrent/future.ML	Wed Nov 06 20:46:00 2013 +0100
     1.3 @@ -68,6 +68,7 @@
     1.4    val join_result: 'a future -> 'a Exn.result
     1.5    val joins: 'a future list -> 'a list
     1.6    val join: 'a future -> 'a
     1.7 +  val join_tasks: task list -> unit
     1.8    val value_result: 'a Exn.result -> 'a future
     1.9    val value: 'a -> 'a future
    1.10    val cond_forks: params -> (unit -> 'a) list -> 'a future list
    1.11 @@ -76,6 +77,7 @@
    1.12    val promise: (unit -> unit) -> 'a future
    1.13    val fulfill_result: 'a future -> 'a Exn.result -> unit
    1.14    val fulfill: 'a future -> 'a -> unit
    1.15 +  val group_snapshot: group -> task list
    1.16    val terminate: group -> unit
    1.17    val shutdown: unit -> unit
    1.18  end;
    1.19 @@ -575,6 +577,14 @@
    1.20  fun joins xs = Par_Exn.release_all (join_results xs);
    1.21  fun join x = Exn.release (join_result x);
    1.22  
    1.23 +fun join_tasks tasks =
    1.24 +  if null tasks then ()
    1.25 +  else
    1.26 +    (singleton o forks)
    1.27 +      {name = "join_tasks", group = SOME (new_group NONE),
    1.28 +        deps = tasks, pri = 0, interrupts = false} I
    1.29 +    |> join;
    1.30 +
    1.31  
    1.32  (* fast-path operations -- bypass task queue if possible *)
    1.33  
    1.34 @@ -663,22 +673,20 @@
    1.35  fun fulfill x res = fulfill_result x (Exn.Res res);
    1.36  
    1.37  
    1.38 +(* group snapshot *)
    1.39 +
    1.40 +fun group_snapshot group =
    1.41 +  SYNCHRONIZED "group_snapshot" (fn () =>
    1.42 +    Task_Queue.group_tasks (! queue) group);
    1.43 +
    1.44 +
    1.45  (* terminate *)
    1.46  
    1.47  fun terminate group =
    1.48 -  let
    1.49 -    val tasks =
    1.50 -      SYNCHRONIZED "terminate" (fn () =>
    1.51 -        let val _ = cancel_group_unsynchronized group;
    1.52 -        in Task_Queue.group_tasks (! queue) group end);
    1.53 -  in
    1.54 -    if null tasks then ()
    1.55 -    else
    1.56 -      (singleton o forks)
    1.57 -        {name = "terminate", group = SOME (new_group NONE),
    1.58 -          deps = tasks, pri = 0, interrupts = false} I
    1.59 -      |> join
    1.60 -  end;
    1.61 +  SYNCHRONIZED "terminate" (fn () =>
    1.62 +    let val _ = cancel_group_unsynchronized group;
    1.63 +    in Task_Queue.group_tasks (! queue) group end)
    1.64 +  |> join_tasks;
    1.65  
    1.66  
    1.67  (* shutdown *)