223 fun present_theory (Exn.Exn exn) = [Exn.Exn exn] |
223 fun present_theory (Exn.Exn exn) = [Exn.Exn exn] |
224 | present_theory (Exn.Res (Result {theory, present, ...})) = |
224 | present_theory (Exn.Res (Result {theory, present, ...})) = |
225 (case present () of |
225 (case present () of |
226 NONE => [] |
226 NONE => [] |
227 | SOME (context as {segments, ...}) => |
227 | SOME (context as {segments, ...}) => |
228 [Exn.capture (fn () => (apply_presentation context theory; (theory, segments))) ()]); |
228 [Exn.capture_body (fn () => (apply_presentation context theory; (theory, segments)))]); |
229 |
229 |
230 in |
230 in |
231 |
231 |
232 val schedule_theories = Thread_Attributes.uninterruptible (fn _ => fn tasks => |
232 val schedule_theories = Thread_Attributes.uninterruptible (fn _ => fn tasks => |
233 let |
233 let |
245 (singleton o Future.forks) |
245 (singleton o Future.forks) |
246 {name = "theory:" ^ name, group = NONE, |
246 {name = "theory:" ^ name, group = NONE, |
247 deps = map (Future.task_of o #2) deps, pri = 0, interrupts = true} |
247 deps = map (Future.task_of o #2) deps, pri = 0, interrupts = true} |
248 (fn () => body (join_parents deps name parents)) |
248 (fn () => body (join_parents deps name parents)) |
249 else |
249 else |
250 Future.value_result (Exn.capture (fn () => body (join_parents deps name parents)) ()) |
250 Future.value_result (Exn.capture_body (fn () => body (join_parents deps name parents))) |
251 | Finished theory => Future.value (theory_result theory))); |
251 | Finished theory => Future.value (theory_result theory))); |
252 |
252 |
253 val results1 = futures |> maps (consolidate_theory o Future.join_result); |
253 val results1 = futures |> maps (consolidate_theory o Future.join_result); |
254 |
254 |
255 val present_results = futures |> maps (present_theory o Future.join_result); |
255 val present_results = futures |> maps (present_theory o Future.join_result); |
256 val results2 = (map o Exn.map_res) (K ()) present_results; |
256 val results2 = (map o Exn.map_res) (K ()) present_results; |
257 |
257 |
258 val results3 = futures |
258 val results3 = futures |
259 |> map (fn future => Exn.capture (fn () => result_commit (Future.join future) ()) ()); |
259 |> map (fn future => Exn.capture_body (fn () => result_commit (Future.join future) ())); |
260 |
260 |
261 val results4 = map Exn.Exn (maps Task_Queue.group_status (Execution.reset ())); |
261 val results4 = map Exn.Exn (maps Task_Queue.group_status (Execution.reset ())); |
262 |
262 |
263 val _ = Par_Exn.release_all (results1 @ results2 @ results3 @ results4); |
263 val _ = Par_Exn.release_all (results1 @ results2 @ results3 @ results4); |
264 in Par_Exn.release_all present_results end); |
264 in Par_Exn.release_all present_results end); |