--- a/src/Pure/ROOT.scala Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/ROOT.scala Fri Jun 23 14:43:15 2023 +0200
@@ -13,6 +13,8 @@
Library.using(a)(f)
def using_option[A <: AutoCloseable, B](opt: Option[A])(f: A => B): Option[B] =
Library.using_option(opt)(f)
+ def using_optional[A <: AutoCloseable, B](opt: Option[A])(f: Option[A] => B): B =
+ Library.using_optional(opt)(f)
val space_explode = Library.space_explode _
val split_lines = Library.split_lines _
--- a/src/Pure/Thy/store.scala Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/Thy/store.scala Fri Jun 23 14:43:15 2023 +0200
@@ -316,8 +316,8 @@
path = dir + file if path.is_file
} yield path.file.delete
- for (db <- maybe_open_heaps_database()) {
- using(db)(ML_Heap.clean_entry(_, name))
+ using_optional(maybe_open_heaps_database()) { database =>
+ database.foreach(ML_Heap.clean_entry(_, name))
}
if (init) {
--- a/src/Pure/Tools/build_job.scala Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/Tools/build_job.scala Fri Jun 23 14:43:15 2023 +0200
@@ -453,11 +453,8 @@
val heap = store.output_heap(session_name)
if (process_result.ok && store_heap && heap.is_file) {
val slice = Space.MiB(options.real("build_database_slice")).bytes
- val digest = {
- val database = store.maybe_open_heaps_database()
- try { ML_Heap.store(database, heap, slice = slice) }
- finally { database.foreach(_.close()) }
- }
+ val digest =
+ using_optional(store.maybe_open_heaps_database())(ML_Heap.store(_, heap, slice))
SHA1.shasum(digest, session_name)
}
else SHA1.no_shasum
--- a/src/Pure/Tools/build_process.scala Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/Tools/build_process.scala Fri Jun 23 14:43:15 2023 +0200
@@ -906,13 +906,10 @@
val cancelled = progress.stopped || !ancestor_results.forall(_.ok)
if (!skipped && !cancelled) {
- val database = store.maybe_open_heaps_database()
- try {
- for (db <- database) {
- ML_Heap.restore(db, store.output_heap(session_name), cache = store.cache.compress)
- }
+ using_optional(store.maybe_open_heaps_database()) { database =>
+ database.foreach(
+ ML_Heap.restore(_, store.output_heap(session_name), cache = store.cache.compress))
}
- finally { database.foreach(_.close()) }
}
val result_name = (session_name, worker_uuid, build_uuid)
--- a/src/Pure/library.scala Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/library.scala Fri Jun 23 14:43:15 2023 +0200
@@ -23,6 +23,16 @@
def using_option[A <: AutoCloseable, B](opt: Option[A])(f: A => B): Option[B] =
opt.map(a => using(a)(f))
+ def using_optional[A <: AutoCloseable, B](opt: Option[A])(f: Option[A] => B): B = {
+ try { f(opt) }
+ finally {
+ opt match {
+ case Some(a) if a != null => a.close()
+ case _ =>
+ }
+ }
+ }
+
/* integers */