equal
deleted
inserted
replaced
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 |