src/Pure/Build/build_job.scala
changeset 83312 6b4028763591
parent 83311 0e40bd617b6c
child 83313 73abc1020bfd
--- a/src/Pure/Build/build_job.scala	Sat Oct 18 18:25:16 2025 +0200
+++ b/src/Pure/Build/build_job.scala	Sat Oct 18 21:20:30 2025 +0200
@@ -160,8 +160,7 @@
     private var nodes_changed = Set.empty[Document_ID.Generic]
     private var nodes_status = Document_Status.Nodes_Status.empty
 
-    private def nodes_status_progress(): Unit = {
-      val state = get_state()
+    private def nodes_status_progress(state: Document.State = get_state()): Unit = {
       val result =
         synchronized {
           for (id <- state.progress_theories if !nodes_changed(id)) nodes_changed += id
@@ -195,9 +194,9 @@
     private lazy val nodes_delay: Delay =
       Delay.first(build_progress_delay) { nodes_status_progress(); nodes_delay.invoke() }
 
-    def nodes_status_sync(): Unit = {
+    def nodes_status_sync(state: Document.State): Unit = {
       nodes_delay.revoke()
-      nodes_status_progress()
+      nodes_status_progress(state = state)
     }
 
     override def start(start_prover: Prover.Receiver => Prover): Unit = {
@@ -205,13 +204,6 @@
       super.start(start_prover)
     }
 
-    override def stop(): Process_Result = {
-      val result = super.stop()
-      nodes_status_sync()
-      stop_process_output()
-      result
-    }
-
     def command_timing(state_id: Document_ID.Generic, props: Properties.T): Unit = synchronized {
       val elapsed = Time.seconds(Markup.Elapsed.get(props))
       if (elapsed.is_notable(build_timing_threshold)) {
@@ -338,7 +330,10 @@
           }
 
           session.init_protocol_handler(new Session.Protocol_Handler {
-              override def exit(exit_state: Document.State): Unit = session.errors_cancel()
+              override def exit(exit_state: Document.State): Unit = {
+                session.nodes_status_sync(exit_state)
+                session.errors_cancel()
+              }
 
               private def build_session_finished(msg: Prover.Protocol_Output): Boolean = {
                 val (rc, errors) =
@@ -444,7 +439,6 @@
                 session.synchronized { stderr ++= Symbol.encode(XML.content(message)) }
               }
               else if (msg.is_exit) {
-                session.nodes_status_sync()
                 val err =
                   "Prover terminated" +
                     (msg.properties match {
@@ -500,6 +494,7 @@
             }
 
           session.stop()
+          session.stop_process_output()
 
           val export_errors =
             export_consumer.shutdown(close = true).map(Output.error_message_text)