src/Pure/goal.ML
changeset 50914 fe4714886d92
parent 50911 ee7fe4230642
child 50974 55f8bd61b029
equal deleted inserted replaced
50913:697e3bb60a3b 50914:fe4714886d92
   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) ();