src/Pure/Concurrent/future.ML
changeset 42545 7da257539a8d
parent 42544 1c191a39549f
child 42559 79716cb61bfd
     1.1 --- a/src/Pure/Concurrent/future.ML	Mon Jan 31 22:57:01 2011 +0100
     1.2 +++ b/src/Pure/Concurrent/future.ML	Mon Jan 31 23:02:53 2011 +0100
     1.3 @@ -44,7 +44,7 @@
     1.4    val group_of: 'a future -> group
     1.5    val peek: 'a future -> 'a Exn.result option
     1.6    val is_finished: 'a future -> bool
     1.7 -  val bulk: {name: string, group: group option, deps: task list, pri: int} ->
     1.8 +  val forks: {name: string, group: group option, deps: task list, pri: int} ->
     1.9      (unit -> 'a) list -> 'a future list
    1.10    val fork_pri: int -> (unit -> 'a) -> 'a future
    1.11    val fork: (unit -> 'a) -> 'a future
    1.12 @@ -400,31 +400,33 @@
    1.13  
    1.14  (* fork *)
    1.15  
    1.16 -fun bulk {name, group, deps, pri} es =
    1.17 -  let
    1.18 -    val grp =
    1.19 -      (case group of
    1.20 -        NONE => worker_subgroup ()
    1.21 -      | SOME grp => grp);
    1.22 -    fun enqueue e (minimal, queue) =
    1.23 -      let
    1.24 -        val (result, job) = future_job grp e;
    1.25 -        val ((task, minimal'), queue') = Task_Queue.enqueue name grp deps pri job queue;
    1.26 -        val future = Future {promised = false, task = task, group = grp, result = result};
    1.27 -      in (future, (minimal orelse minimal', queue')) end;
    1.28 -  in
    1.29 -    SYNCHRONIZED "enqueue" (fn () =>
    1.30 -      let
    1.31 -        val (futures, minimal) =
    1.32 -          Unsynchronized.change_result queue (fn q =>
    1.33 -            let val (futures, (minimal, q')) = fold_map enqueue es (false, q)
    1.34 -            in ((futures, minimal), q') end);
    1.35 -        val _ = if minimal then signal work_available else ();
    1.36 -        val _ = scheduler_check ();
    1.37 -      in futures end)
    1.38 -  end;
    1.39 +fun forks {name, group, deps, pri} es =
    1.40 +  if null es then []
    1.41 +  else
    1.42 +    let
    1.43 +      val grp =
    1.44 +        (case group of
    1.45 +          NONE => worker_subgroup ()
    1.46 +        | SOME grp => grp);
    1.47 +      fun enqueue e (minimal, queue) =
    1.48 +        let
    1.49 +          val (result, job) = future_job grp e;
    1.50 +          val ((task, minimal'), queue') = Task_Queue.enqueue name grp deps pri job queue;
    1.51 +          val future = Future {promised = false, task = task, group = grp, result = result};
    1.52 +        in (future, (minimal orelse minimal', queue')) end;
    1.53 +    in
    1.54 +      SYNCHRONIZED "enqueue" (fn () =>
    1.55 +        let
    1.56 +          val (futures, minimal) =
    1.57 +            Unsynchronized.change_result queue (fn q =>
    1.58 +              let val (futures, (minimal, q')) = fold_map enqueue es (false, q)
    1.59 +              in ((futures, minimal), q') end);
    1.60 +          val _ = if minimal then signal work_available else ();
    1.61 +          val _ = scheduler_check ();
    1.62 +        in futures end)
    1.63 +    end;
    1.64  
    1.65 -fun fork_pri pri e = singleton (bulk {name = "", group = NONE, deps = [], pri = pri}) e;
    1.66 +fun fork_pri pri e = singleton (forks {name = "", group = NONE, deps = [], pri = pri}) e;
    1.67  fun fork e = fork_pri 0 e;
    1.68  
    1.69  
    1.70 @@ -501,7 +503,7 @@
    1.71      if extended then Future {promised = false, task = task, group = group, result = result}
    1.72      else
    1.73        singleton
    1.74 -        (bulk {name = "Future.map", group = SOME group,
    1.75 +        (forks {name = "Future.map", group = SOME group,
    1.76            deps = [task], pri = Task_Queue.pri_of_task task})
    1.77          (fn () => f (join x))
    1.78    end;