src/Pure/Concurrent/future.ML
changeset 28304 4b0477452943
parent 28276 fbc707811203
child 28320 c6aef67f964d
equal deleted inserted replaced
28303:8c4a4f256c16 28304:4b0477452943
    30   type task = TaskQueue.task
    30   type task = TaskQueue.task
    31   type group = TaskQueue.group
    31   type group = TaskQueue.group
    32   type 'a T
    32   type 'a T
    33   val task_of: 'a T -> task
    33   val task_of: 'a T -> task
    34   val group_of: 'a T -> group
    34   val group_of: 'a T -> group
    35   val future: group option -> task list -> (unit -> 'a) -> 'a T
    35   val future: group option -> task list -> bool -> (unit -> 'a) -> 'a T
    36   val fork: (unit -> 'a) -> 'a T
    36   val fork: (unit -> 'a) -> 'a T
       
    37   val fork_irrelevant: (unit -> 'a) -> 'a T
    37   val join_results: 'a T list -> 'a Exn.result list
    38   val join_results: 'a T list -> 'a Exn.result list
    38   val join: 'a T -> 'a
    39   val join: 'a T -> 'a
    39   val focus: task list -> unit
    40   val focus: task list -> unit
    40   val interrupt_task: string -> unit
    41   val interrupt_task: string -> unit
    41   val cancel: 'a T -> unit
    42   val cancel: 'a T -> unit
   207   else ());
   208   else ());
   208 
   209 
   209 
   210 
   210 (* future values: fork independent computation *)
   211 (* future values: fork independent computation *)
   211 
   212 
   212 fun future opt_group deps (e: unit -> 'a) =
   213 fun future opt_group deps pri (e: unit -> 'a) =
   213   let
   214   let
   214     val _ = scheduler_check ();
   215     val _ = scheduler_check ();
   215 
   216 
   216     val group = (case opt_group of SOME group => group | NONE => TaskQueue.new_group ());
   217     val group = (case opt_group of SOME group => group | NONE => TaskQueue.new_group ());
   217 
   218 
   220       (fn _ => fn ok =>
   221       (fn _ => fn ok =>
   221         let val res = if ok then Exn.capture e () else Exn.Exn Interrupt
   222         let val res = if ok then Exn.capture e () else Exn.Exn Interrupt
   222         in result := SOME res; is_some (Exn.get_result res) end);
   223         in result := SOME res; is_some (Exn.get_result res) end);
   223 
   224 
   224     val task = SYNCHRONIZED "future" (fn () =>
   225     val task = SYNCHRONIZED "future" (fn () =>
   225       change_result queue (TaskQueue.enqueue group deps run) before notify_all ());
   226       change_result queue (TaskQueue.enqueue group deps pri run) before notify_all ());
   226   in Future {task = task, group = group, result = result} end;
   227   in Future {task = task, group = group, result = result} end;
   227 
   228 
   228 fun fork e = future (Option.map #2 (thread_data ())) [] e;
   229 fun fork e = future (Option.map #2 (thread_data ())) [] true e;
       
   230 fun fork_irrelevant e = future (Option.map #2 (thread_data ())) [] false e;
   229 
   231 
   230 
   232 
   231 (* join: retrieve results *)
   233 (* join: retrieve results *)
   232 
   234 
   233 fun join_results xs =
   235 fun join_results xs =