clarified Future.cond_forks: more uniform handling of exceptional situations;
authorwenzelm
Fri, 19 Aug 2011 12:03:44 +0200
changeset 45169a0ddd5760444
parent 45164 83c4f8ba0aa3
child 45170 e43f0ea90c9a
clarified Future.cond_forks: more uniform handling of exceptional situations;
src/Pure/Concurrent/future.ML
     1.1 --- a/src/Pure/Concurrent/future.ML	Fri Aug 19 17:05:10 2011 +0900
     1.2 +++ b/src/Pure/Concurrent/future.ML	Fri Aug 19 12:03:44 2011 +0200
     1.3 @@ -58,6 +58,7 @@
     1.4    val join_results: 'a future list -> 'a Exn.result list
     1.5    val join_result: 'a future -> 'a Exn.result
     1.6    val join: 'a future -> 'a
     1.7 +  val value_result: 'a Exn.result -> 'a future
     1.8    val value: 'a -> 'a future
     1.9    val map: ('a -> 'b) -> 'a future -> 'b future
    1.10    val cond_forks: fork_params -> (unit -> 'a) list -> 'a future list
    1.11 @@ -524,14 +525,16 @@
    1.12  
    1.13  (* fast-path versions -- bypassing task queue *)
    1.14  
    1.15 -fun value (x: 'a) =
    1.16 +fun value_result (res: 'a Exn.result) =
    1.17    let
    1.18      val task = Task_Queue.dummy_task ();
    1.19      val group = Task_Queue.group_of_task task;
    1.20      val result = Single_Assignment.var "value" : 'a result;
    1.21 -    val _ = assign_result group result (Exn.Res x);
    1.22 +    val _ = assign_result group result res;
    1.23    in Future {promised = false, task = task, result = result} end;
    1.24  
    1.25 +fun value x = value_result (Exn.Res x);
    1.26 +
    1.27  fun map_future f x =
    1.28    let
    1.29      val task = task_of x;
    1.30 @@ -553,7 +556,7 @@
    1.31  
    1.32  fun cond_forks args es =
    1.33    if Multithreading.enabled () then forks args es
    1.34 -  else map (fn e => value (e ())) es;
    1.35 +  else map (fn e => value_result (Exn.interruptible_capture e ())) es;
    1.36  
    1.37  
    1.38  (* promised futures -- fulfilled by external means *)