src/Pure/Concurrent/future.ML
changeset 28548 003f52c2bb8f
parent 28534 4c7704c08951
child 28558 2a6297b4273c
equal deleted inserted replaced
28547:c81f6344bfb7 28548:003f52c2bb8f
   240     val result = ref (NONE: 'a Exn.result option);
   240     val result = ref (NONE: 'a Exn.result option);
   241     val run = Multithreading.with_attributes (Thread.getAttributes ())
   241     val run = Multithreading.with_attributes (Thread.getAttributes ())
   242       (fn _ => fn ok =>
   242       (fn _ => fn ok =>
   243         let
   243         let
   244           val res = if ok then Exn.capture e () else Exn.Exn Exn.Interrupt;
   244           val res = if ok then Exn.capture e () else Exn.Exn Exn.Interrupt;
       
   245           val _ = result := SOME res;
   245           val res_ok =
   246           val res_ok =
   246             (case res of
   247             (case res of
   247               Exn.Result _ => true
   248               Exn.Result _ => true
   248             | Exn.Exn Exn.Interrupt => true
   249             | Exn.Exn Exn.Interrupt => (TaskQueue.invalidate_group group; true)
   249             | _ => false);
   250             | _ => false);
   250         in result := SOME res; res_ok end);
   251         in res_ok end);
   251 
   252 
   252     val task = SYNCHRONIZED "future" (fn () =>
   253     val task = SYNCHRONIZED "future" (fn () =>
   253       change_result queue (TaskQueue.enqueue group deps pri run) before notify_all ());
   254       change_result queue (TaskQueue.enqueue group deps pri run) before notify_all ());
   254   in Future {task = task, group = group, result = result} end;
   255   in Future {task = task, group = group, result = result} end;
   255 
   256