src/Pure/Tools/build.scala
changeset 71601 97ccf48c2f0c
parent 71598 269dc4bf1f40
child 71604 c6fa217c9d5e
equal deleted inserted replaced
71600:64aad1e46f98 71601:97ccf48c2f0c
   334 
   334 
   335     def join: (Process_Result, Option[String]) =
   335     def join: (Process_Result, Option[String]) =
   336     {
   336     {
   337       val result0 = future_result.join
   337       val result0 = future_result.join
   338       val result1 =
   338       val result1 =
   339         export_consumer.shutdown(close = true).map(Output.error_message_text(_)) match {
   339         export_consumer.shutdown(close = true).map(Output.error_message_text) match {
   340           case Nil => result0
   340           case Nil => result0
   341           case errs => result0.errors(errs).error_rc
   341           case errs => result0.errors(errs).error_rc
   342         }
   342         }
   343 
   343 
   344       Isabelle_System.rm_tree(export_tmp_dir)
   344       Isabelle_System.rm_tree(export_tmp_dir)
   378   {
   378   {
   379     def sessions: Set[String] = results.keySet
   379     def sessions: Set[String] = results.keySet
   380     def cancelled(name: String): Boolean = results(name)._1.isEmpty
   380     def cancelled(name: String): Boolean = results(name)._1.isEmpty
   381     def apply(name: String): Process_Result = results(name)._1.getOrElse(Process_Result(1))
   381     def apply(name: String): Process_Result = results(name)._1.getOrElse(Process_Result(1))
   382     def info(name: String): Sessions.Info = results(name)._2
   382     def info(name: String): Sessions.Info = results(name)._2
   383     val rc =
   383     val rc: Int =
   384       (0 /: results.iterator.map(
   384       (0 /: results.iterator.map(
   385         { case (_, (Some(r), _)) => r.rc case (_, (None, _)) => 1 }))(_ max _)
   385         { case (_, (Some(r), _)) => r.rc case (_, (None, _)) => 1 }))(_ max _)
   386     def ok: Boolean = rc == 0
   386     def ok: Boolean = rc == 0
   387 
   387 
   388     override def toString: String = rc.toString
   388     override def toString: String = rc.toString
   578                     Session_Info(sources_stamp(deps, name), input_heaps, heap_digest,
   578                     Session_Info(sources_stamp(deps, name), input_heaps, heap_digest,
   579                       process_result.rc)))
   579                       process_result.rc)))
   580             }
   580             }
   581 
   581 
   582             // messages
   582             // messages
   583             process_result.err_lines.foreach(progress.echo(_))
   583             process_result.err_lines.foreach(progress.echo)
   584 
   584 
   585             if (process_result.ok)
   585             if (process_result.ok)
   586               progress.echo("Finished " + name + " (" + process_result.timing.message_resources + ")")
   586               progress.echo("Finished " + name + " (" + process_result.timing.message_resources + ")")
   587             else {
   587             else {
   588               progress.echo(name + " FAILED")
   588               progress.echo(name + " FAILED")
   592             loop(pending - name, running - name,
   592             loop(pending - name, running - name,
   593               results + (name -> Result(false, heap_digest, Some(process_result_tail), job.info)))
   593               results + (name -> Result(false, heap_digest, Some(process_result_tail), job.info)))
   594             //}}}
   594             //}}}
   595           case None if running.size < (max_jobs max 1) =>
   595           case None if running.size < (max_jobs max 1) =>
   596             //{{{ check/start next job
   596             //{{{ check/start next job
   597             pending.dequeue(running.isDefinedAt(_)) match {
   597             pending.dequeue(running.isDefinedAt) match {
   598               case Some((name, info)) =>
   598               case Some((name, info)) =>
   599                 val ancestor_results =
   599                 val ancestor_results =
   600                   deps.sessions_structure.build_requirements(List(name)).filterNot(_ == name).
   600                   deps.sessions_structure.build_requirements(List(name)).filterNot(_ == name).
   601                     map(results(_))
   601                     map(results(_))
   602                 val ancestor_heaps = ancestor_results.flatMap(_.heap_digest)
   602                 val ancestor_heaps = ancestor_results.flatMap(_.heap_digest)
   637                   progress.echo((if (do_output) "Building " else "Running ") + name + " ...")
   637                   progress.echo((if (do_output) "Building " else "Running ") + name + " ...")
   638 
   638 
   639                   store.clean_output(name)
   639                   store.clean_output(name)
   640                   using(store.open_database(name, output = true))(store.init_session_info(_, name))
   640                   using(store.open_database(name, output = true))(store.init_session_info(_, name))
   641 
   641 
   642                   val numa_node = numa_nodes.next(used_node(_))
   642                   val numa_node = numa_nodes.next(used_node)
   643                   val job =
   643                   val job =
   644                     new Job(progress, name, info, deps, store, do_output, verbose, pide = pide,
   644                     new Job(progress, name, info, deps, store, do_output, verbose, pide = pide,
   645                       numa_node, queue.command_timings(name))
   645                       numa_node, queue.command_timings(name))
   646                   loop(pending, running + (name -> (ancestor_heaps, job)), results)
   646                   loop(pending, running + (name -> (ancestor_heaps, job)), results)
   647                 }
   647                 }