equal
deleted
inserted
replaced
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 = |