# HG changeset patch # User wenzelm # Date 1695724208 -7200 # Node ID 9506b852ebdf8632cd99fa27d8d65af736a5c074 # Parent eb2255d241da2091b5d3aab024469ad89326fc02 clarified signature: distinction of unmanaged vs. managed interrupts (not implemented yet); diff -r eb2255d241da -r 9506b852ebdf src/Pure/Concurrent/isabelle_thread.ML --- a/src/Pure/Concurrent/isabelle_thread.ML Mon Sep 25 21:58:58 2023 +0200 +++ b/src/Pure/Concurrent/isabelle_thread.ML Tue Sep 26 12:30:08 2023 +0200 @@ -25,6 +25,7 @@ val interrupt_exn: 'a Exn.result val interrupt_self: unit -> 'a val interrupt_other: T -> unit + structure Exn: EXN val expose_interrupt_result: unit -> unit Exn.result val expose_interrupt: unit -> unit (*exception Interrupt*) val try_catch: (unit -> 'a) -> (exn -> 'a) -> 'a @@ -123,6 +124,12 @@ fun interrupt_other t = Thread.Thread.interrupt (get_thread t) handle Thread.Thread _ => (); +structure Exn: EXN = +struct + open Exn; + val capture = capture0; +end; + fun expose_interrupt_result () = let val orig_atts = Thread_Attributes.safe_interrupts (Thread_Attributes.get_attributes ()); @@ -146,3 +153,5 @@ fun can e = Basics.can e (); end; + +structure Exn = Isabelle_Thread.Exn; diff -r eb2255d241da -r 9506b852ebdf src/Pure/Concurrent/multithreading.ML --- a/src/Pure/Concurrent/multithreading.ML Mon Sep 25 21:58:58 2023 +0200 +++ b/src/Pure/Concurrent/multithreading.ML Tue Sep 26 12:30:08 2023 +0200 @@ -96,14 +96,14 @@ val time = Timer.checkRealTimer timer; val _ = tracing_time true time (fn () => name ^ ": locked after " ^ Time.toString time); in false end; - val result = Exn.capture (restore_attributes e) (); + val result = Exn.capture0 (restore_attributes e) (); val _ = if immediate then () else tracing 5 (fn () => name ^ ": unlocking ..."); val _ = Thread.Mutex.unlock lock; in result end else let val _ = Thread.Mutex.lock lock; - val result = Exn.capture (restore_attributes e) (); + val result = Exn.capture0 (restore_attributes e) (); val _ = Thread.Mutex.unlock lock; in result end) ()); diff -r eb2255d241da -r 9506b852ebdf src/Pure/Concurrent/thread_attributes.ML --- a/src/Pure/Concurrent/thread_attributes.ML Mon Sep 25 21:58:58 2023 +0200 +++ b/src/Pure/Concurrent/thread_attributes.ML Tue Sep 26 12:30:08 2023 +0200 @@ -95,7 +95,7 @@ if atts1 = atts2 then e atts1 else let - val result = Exn.capture (fn () => (set_attributes atts2; e atts1)) (); + val result = Exn.capture0 (fn () => (set_attributes atts2; e atts1)) (); val _ = set_attributes atts1; in Exn.release result end end; diff -r eb2255d241da -r 9506b852ebdf src/Pure/Concurrent/thread_data.ML --- a/src/Pure/Concurrent/thread_data.ML Mon Sep 25 21:58:58 2023 +0200 +++ b/src/Pure/Concurrent/thread_data.ML Tue Sep 26 12:30:08 2023 +0200 @@ -34,7 +34,7 @@ let val orig_data = get v; val _ = put v data; - val result = Exn.capture (restore_attributes f) x; + val result = Exn.capture0 (restore_attributes f) x; val _ = put v orig_data; in Exn.release result end) (); diff -r eb2255d241da -r 9506b852ebdf src/Pure/Concurrent/unsynchronized.ML --- a/src/Pure/Concurrent/unsynchronized.ML Mon Sep 25 21:58:58 2023 +0200 +++ b/src/Pure/Concurrent/unsynchronized.ML Tue Sep 26 12:30:08 2023 +0200 @@ -43,7 +43,7 @@ let val orig_value = ! flag; val _ = flag := value; - val result = Exn.capture (restore_attributes f) x; + val result = Exn.capture0 (restore_attributes f) x; val _ = flag := orig_value; in Exn.release result end) (); diff -r eb2255d241da -r 9506b852ebdf src/Pure/General/exn.ML --- a/src/Pure/General/exn.ML Mon Sep 25 21:58:58 2023 +0200 +++ b/src/Pure/General/exn.ML Tue Sep 26 12:30:08 2023 +0200 @@ -11,7 +11,7 @@ val cat_error: string -> string -> 'a end; -signature EXN = +signature EXN0 = sig include BASIC_EXN val polyml_location: exn -> PolyML.location option @@ -21,7 +21,7 @@ val is_exn: 'a result -> bool val get_res: 'a result -> 'a option val get_exn: 'a result -> exn option - val capture: ('a -> 'b) -> 'a -> 'b result + val capture0: ('a -> 'b) -> 'a -> 'b result (*unmanaged interrupts*) val release: 'a result -> 'a val map_res: ('a -> 'b) -> 'a result -> 'b result val maps_res: ('a -> 'b result) -> 'a result -> 'b result @@ -35,7 +35,13 @@ val trace: (exn -> string) -> (string -> unit) -> (unit -> 'a) -> 'a end; -structure Exn: EXN = +signature EXN = +sig + include EXN0 + val capture: ('a -> 'b) -> 'a -> 'b result (*managed interrupts*) +end; + +structure Exn: EXN0 = struct (* location *) @@ -74,7 +80,7 @@ fun get_exn (Exn exn) = SOME exn | get_exn _ = NONE; -fun capture f x = Res (f x) handle e => Exn e; +fun capture0 f x = Res (f x) handle e => Exn e; fun release (Res y) = y | release (Exn e) = reraise e;