# HG changeset patch # User wenzelm # Date 1350500691 -7200 # Node ID 0d4106850eb225f6b2e40790c1fed8b86828313d # Parent 09956f7a00af3f75c3d0245eb584ec3f3913c15b more robust Session.finish (batch mode): use Goal.finish_futures to exhibit remaining failures of disconnected goal forks (e.g. from unnamed theorems) and Goal.cancel_futures the purge the persistent state; diff -r 09956f7a00af -r 0d4106850eb2 src/Pure/System/session.ML --- a/src/Pure/System/session.ML Wed Oct 17 14:58:04 2012 +0200 +++ b/src/Pure/System/session.ML Wed Oct 17 21:04:51 2012 +0200 @@ -72,6 +72,8 @@ Keyword.status (); Outer_Syntax.check_syntax (); Future.shutdown (); + Goal.finish_futures (); + Goal.cancel_futures (); Options.reset_default (); session_finished := true); diff -r 09956f7a00af -r 0d4106850eb2 src/Pure/goal.ML --- a/src/Pure/goal.ML Wed Oct 17 14:58:04 2012 +0200 +++ b/src/Pure/goal.ML Wed Oct 17 21:04:51 2012 +0200 @@ -27,6 +27,7 @@ val fork_name: string -> (unit -> 'a) -> 'a future val fork: (unit -> 'a) -> 'a future val peek_futures: serial -> unit future list + val finish_futures: unit -> unit val cancel_futures: unit -> unit val future_enabled_level: int -> bool val future_enabled: unit -> bool @@ -173,6 +174,11 @@ fun peek_futures id = Inttab.lookup_list (#3 (Synchronized.value forked_proofs)) id; +fun finish_futures () = + (case map_filter Task_Queue.group_status (#2 (Synchronized.value forked_proofs)) of + [] => () + | exns => raise Par_Exn.make exns); + fun cancel_futures () = Synchronized.change forked_proofs (fn (m, groups, tab) => (List.app Future.cancel_group groups; (0, [], Inttab.empty)));