135 in |
135 in |
136 |
136 |
137 fun fork_name name e = |
137 fun fork_name name e = |
138 uninterruptible (fn _ => fn () => |
138 uninterruptible (fn _ => fn () => |
139 let |
139 let |
140 val id = the_default 0 (Position.parse_id (Position.thread_data ())); |
140 val pos = Position.thread_data (); |
|
141 val id = the_default 0 (Position.parse_id pos); |
141 val _ = count_forked 1; |
142 val _ = count_forked 1; |
|
143 |
142 val future = |
144 val future = |
143 (singleton o Future.forks) |
145 (singleton o Future.forks) |
144 {name = name, group = NONE, deps = [], pri = ~1, interrupts = false} |
146 {name = name, group = NONE, deps = [], pri = ~1, interrupts = false} |
145 (fn () => |
147 (fn () => |
146 let |
148 let |
147 val task = the (Future.worker_task ()); |
149 val task = the (Future.worker_task ()); |
148 val _ = status task [Markup.running]; |
150 val _ = status task [Markup.running]; |
149 val result = Exn.capture (Future.interruptible_task e) (); |
151 val result = |
|
152 Exn.capture (Future.interruptible_task e) () |
|
153 |> Future.identify_result pos; |
150 val _ = status task [Markup.finished, Markup.joined]; |
154 val _ = status task [Markup.finished, Markup.joined]; |
151 val _ = |
155 val _ = |
152 (case result of |
156 (case result of |
153 Exn.Res _ => () |
157 Exn.Res _ => () |
154 | Exn.Exn exn => |
158 | Exn.Exn exn => |
155 if id = 0 orelse Exn.is_interrupt exn then () |
159 if id = 0 orelse Exn.is_interrupt exn then () |
156 else |
160 else |
157 (status task [Markup.failed]; |
161 (status task [Markup.failed]; |
158 Output.report (Markup.markup_only Markup.bad); |
162 Output.report (Markup.markup_only Markup.bad); |
159 Output.error_msg (ML_Compiler.exn_message exn))); |
163 List.app (Future.error_msg pos) (ML_Compiler.exn_messages_ids exn))); |
160 val _ = count_forked ~1; |
164 val _ = count_forked ~1; |
161 in Exn.release result end); |
165 in Exn.release result end); |
162 val _ = status (Future.task_of future) [Markup.forked]; |
166 val _ = status (Future.task_of future) [Markup.forked]; |
163 val _ = register_forked id future; |
167 val _ = register_forked id future; |
164 in future end) (); |
168 in future end) (); |