synchronized cancel and flushing of Multithreading.interrupted state, to ensure that interrupts stay within task boundaries;
authorwenzelm
Wed, 10 Aug 2011 14:28:55 +0200
changeset 44111 2d16c693d536
parent 44110 058520fa03a8
child 44112 ef876972fdc1
synchronized cancel and flushing of Multithreading.interrupted state, to ensure that interrupts stay within task boundaries;
src/Pure/Concurrent/future.ML
--- a/src/Pure/Concurrent/future.ML	Wed Aug 10 14:04:45 2011 +0200
+++ b/src/Pure/Concurrent/future.ML	Wed Aug 10 14:28:55 2011 +0200
@@ -197,6 +197,7 @@
     val _ = SYNCHRONIZED "finish" (fn () =>
       let
         val maximal = Unsynchronized.change_result queue (Task_Queue.finish task);
+        val _ = Exn.capture Multithreading.interrupted ();
         val _ =
           if ok then ()
           else if cancel_now group then ()
@@ -397,7 +398,8 @@
         | _ => reraise exn);
     val ok =
       (case the (Single_Assignment.peek result) of
-        Exn.Exn exn => (Task_Queue.cancel_group group exn; false)
+        Exn.Exn exn =>
+          (SYNCHRONIZED "cancel" (fn () => Task_Queue.cancel_group group exn); false)
       | Exn.Res _ => true);
   in ok end;