301 nodes_of (the_version state version_id) |> String_Graph.schedule |
301 nodes_of (the_version state version_id) |> String_Graph.schedule |
302 (fn deps => fn (name, node) => |
302 (fn deps => fn (name, node) => |
303 if visible_node node orelse pending_result node then |
303 if visible_node node orelse pending_result node then |
304 let |
304 let |
305 val former_task = Symtab.lookup frontier name; |
305 val former_task = Symtab.lookup frontier name; |
|
306 fun body () = |
|
307 iterate_entries (fn (_, opt_exec) => fn () => |
|
308 (case opt_exec of |
|
309 SOME exec => |
|
310 if Execution.is_running execution_id |
|
311 then SOME (Command.exec execution_id exec) |
|
312 else NONE |
|
313 | NONE => NONE)) node () |
|
314 handle exn => if Exn.is_interrupt exn then () (*sic!*) else reraise exn; |
306 val future = |
315 val future = |
307 (singleton o Future.forks) |
316 (singleton o Future.forks) |
308 {name = "theory:" ^ name, group = SOME (Future.new_group NONE), |
317 {name = "theory:" ^ name, group = SOME (Future.new_group NONE), |
309 deps = the_list former_task @ map #2 (maps #2 deps), |
318 deps = the_list former_task @ map #2 (maps #2 deps), |
310 pri = pri, interrupts = false} |
319 pri = pri, interrupts = false} body; |
311 (fn () => |
|
312 iterate_entries (fn (_, opt_exec) => fn () => |
|
313 (case opt_exec of |
|
314 SOME exec => |
|
315 if Execution.is_running execution_id |
|
316 then SOME (Command.exec execution_id exec) |
|
317 else NONE |
|
318 | NONE => NONE)) node ()); |
|
319 in [(name, Future.task_of future)] end |
320 in [(name, Future.task_of future)] end |
320 else []) |
321 else []) |
321 else []; |
322 else []; |
322 val frontier' = (fold o fold) Symtab.update new_tasks frontier; |
323 val frontier' = (fold o fold) Symtab.update new_tasks frontier; |
323 val execution' = {version_id = version_id, execution_id = execution_id, frontier = frontier'}; |
324 val execution' = {version_id = version_id, execution_id = execution_id, frontier = frontier'}; |