diff -r 1bbf29ec9ce3 -r fcda9a009213 src/Pure/Tools/build_process.scala --- a/src/Pure/Tools/build_process.scala Mon Mar 06 12:07:40 2023 +0100 +++ b/src/Pure/Tools/build_process.scala Mon Mar 06 12:08:33 2023 +0100 @@ -273,8 +273,9 @@ val ml_platform = SQL.Column.string("ml_platform") val options = SQL.Column.string("options") val start = SQL.Column.date("start") + val end = SQL.Column.date("end") - val table = make_table("", List(build_uuid, ml_platform, options, start)) + val table = make_table("", List(build_uuid, ml_platform, options, start, end)) } def start_build( @@ -288,10 +289,19 @@ stmt.string(2) = ml_platform stmt.string(3) = options stmt.date(4) = db.now() + stmt.date(5) = None stmt.execute() } } + def end_build(db: SQL.Database, build_uuid: String): Unit = + db.using_statement( + Base.table.update(List(Base.end), sql = SQL.where(Generic.sql(build_uuid = build_uuid))) + ) { stmt => + stmt.date(1) = db.now() + stmt.execute() + } + /* sessions */ @@ -806,6 +816,12 @@ } } + def exit(): Unit = synchronized_database { + for (db <- _database) { + Build_Process.Data.end_build(db, build_uuid) + } + } + def sleep(): Unit = Isabelle_Thread.interrupt_handler(_ => progress.stop()) { build_options.seconds("editor_input_delay").sleep() @@ -829,25 +845,28 @@ } else { init() - while (!finished()) { - if (progress.stopped) synchronized_database { _state.stop_running() } + try { + while (!finished()) { + if (progress.stopped) synchronized_database { _state.stop_running() } - for (job <- synchronized_database { _state.finished_running() }) { - val job_name = job.job_name - val (process_result, output_shasum) = job.join - synchronized_database { - _state = _state. - remove_pending(job_name). - remove_running(job_name). - make_result(job_name, process_result, output_shasum, node_info = job.node_info) + for (job <- synchronized_database { _state.finished_running() }) { + val job_name = job.job_name + val (process_result, output_shasum) = job.join + synchronized_database { + _state = _state. + remove_pending(job_name). + remove_running(job_name). + make_result(job_name, process_result, output_shasum, node_info = job.node_info) + } + } + + if (!start()) { + sync_database() + sleep() } } - - if (!start()) { - sync_database() - sleep() - } } + finally exit() synchronized_database { for ((name, result) <- _state.results) yield name -> result.process_result