src/Pure/Concurrent/future.ML
changeset 44262 355d5438f5fb
parent 44249 64620f1d6f87
child 44268 f6a11c1da821
equal deleted inserted replaced
44261:e44f465c00a1 44262:355d5438f5fb
   392 fun cancel x = cancel_group (Task_Queue.group_of_task (task_of x));
   392 fun cancel x = cancel_group (Task_Queue.group_of_task (task_of x));
   393 
   393 
   394 
   394 
   395 (* future jobs *)
   395 (* future jobs *)
   396 
   396 
   397 fun assign_result group result res =
   397 fun assign_result group result raw_res =
   398   let
   398   let
       
   399     val res =
       
   400       (case raw_res of
       
   401         Exn.Exn exn => Exn.Exn (#2 (Par_Exn.serial exn))
       
   402       | _ => raw_res);
   399     val _ = Single_Assignment.assign result res
   403     val _ = Single_Assignment.assign result res
   400       handle exn as Fail _ =>
   404       handle exn as Fail _ =>
   401         (case Single_Assignment.peek result of
   405         (case Single_Assignment.peek result of
   402           SOME (Exn.Exn e) => reraise (if Exn.is_interrupt e then e else exn)
   406           SOME (Exn.Exn e) => reraise (if Exn.is_interrupt e then e else exn)
   403         | _ => reraise exn);
   407         | _ => reraise exn);
   471 fun get_result x =
   475 fun get_result x =
   472   (case peek x of
   476   (case peek x of
   473     NONE => Exn.Exn (Fail "Unfinished future")
   477     NONE => Exn.Exn (Fail "Unfinished future")
   474   | SOME res =>
   478   | SOME res =>
   475       if Exn.is_interrupt_exn res then
   479       if Exn.is_interrupt_exn res then
   476         (case Exn.flatten_list (Task_Queue.group_status (Task_Queue.group_of_task (task_of x))) of
   480         (case Task_Queue.group_status (Task_Queue.group_of_task (task_of x)) of
   477           [] => res
   481           NONE => res
   478         | exns => Exn.Exn (Exn.EXCEPTIONS exns))
   482         | SOME exn => Exn.Exn exn)
   479       else res);
   483       else res);
   480 
   484 
   481 fun join_next deps = (*requires SYNCHRONIZED*)
   485 fun join_next deps = (*requires SYNCHRONIZED*)
   482   if null deps then NONE
   486   if null deps then NONE
   483   else
   487   else