src/Pure/Concurrent/lazy.ML
changeset 78720 909dc00766a0
parent 78716 97dfba4405e3
child 78757 a094bf81a496
equal deleted inserted replaced
78719:89038d9ef77d 78720:909dc00766a0
    83 fun force_result _ (Value a) = Exn.Res a
    83 fun force_result _ (Value a) = Exn.Res a
    84   | force_result {strict} (Lazy var) =
    84   | force_result {strict} (Lazy var) =
    85       (case peek (Lazy var) of
    85       (case peek (Lazy var) of
    86         SOME res => res
    86         SOME res => res
    87       | NONE =>
    87       | NONE =>
    88           Thread_Attributes.uninterruptible (fn run => fn () =>
    88           Thread_Attributes.uninterruptible_body (fn run =>
    89             let
    89             let
    90               val (expr, x) =
    90               val (expr, x) =
    91                 Synchronized.change_result var
    91                 Synchronized.change_result var
    92                   (fn Expr (name, e) =>
    92                   (fn Expr (name, e) =>
    93                         let val x = Future.promise_name name I
    93                         let val x = Future.promise_name name I
   113                       (*semantic race: some other threads might see the same
   113                       (*semantic race: some other threads might see the same
   114                         interrupt, until there is a fresh start*)
   114                         interrupt, until there is a fresh start*)
   115                       else Synchronized.change var (fn _ => Expr (name, e));
   115                       else Synchronized.change var (fn _ => Expr (name, e));
   116                   in res end
   116                   in res end
   117               | NONE => Exn.capture (run (fn () => Future.join x)) ())
   117               | NONE => Exn.capture (run (fn () => Future.join x)) ())
   118             end) ());
   118             end));
   119 
   119 
   120 end;
   120 end;
   121 
   121 
   122 fun force x = Exn.release (force_result {strict = false} x);
   122 fun force x = Exn.release (force_result {strict = false} x);
   123 
   123