# HG changeset patch # User wenzelm # Date 1237637472 -3600 # Node ID 046f4f986fb57bfabf7a3ea79dba7bb01ac07175 # Parent 620db300c038ca4eb5d3fc433cecbfc7ab2ee586 restricted interrupts for tasks running as future worker thread -- attempt to prevent interrupt race conditions; diff -r 620db300c038 -r 046f4f986fb5 src/Pure/Concurrent/future.ML --- a/src/Pure/Concurrent/future.ML Sat Mar 21 12:37:13 2009 +0100 +++ b/src/Pure/Concurrent/future.ML Sat Mar 21 13:11:12 2009 +0100 @@ -44,6 +44,7 @@ val join_result: 'a future -> 'a Exn.result val join: 'a future -> 'a val map: ('a -> 'b) -> 'a future -> 'b future + val interruptible_task: ('a -> 'b) -> 'a -> 'b val interrupt_task: string -> unit val cancel_group: group -> unit val cancel: 'a future -> unit @@ -350,6 +351,15 @@ (* cancellation *) +fun interruptible_task f x = + if Multithreading.available then + Multithreading.with_attributes + (if is_some (thread_data ()) + then Multithreading.restricted_interrupts + else Multithreading.regular_interrupts) + (fn _ => f) x + else interruptible f x; + (*interrupt: permissive signal, may get ignored*) fun interrupt_task id = SYNCHRONIZED "interrupt" (fn () => Task_Queue.interrupt_external (! queue) id); diff -r 620db300c038 -r 046f4f986fb5 src/Pure/Isar/toplevel.ML --- a/src/Pure/Isar/toplevel.ML Sat Mar 21 12:37:13 2009 +0100 +++ b/src/Pure/Isar/toplevel.ML Sat Mar 21 13:11:12 2009 +0100 @@ -311,7 +311,7 @@ fun controlled_execution f = f |> debugging - |> interruptible; + |> Future.interruptible_task; fun program f = (f