From 4cf10686d6dcce43e660787f26377a4d2f6ff34a Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 21 Apr 2022 17:35:51 +0300 Subject: [PATCH] Native: delete konan_temp right after the compilation instead of on exit The Kotlin/Native compiler uses `.deleteOnExit()` as a substitute for "delete after the compilation". But when the compiler runs in a Gradle daemon, `.deleteOnExit()` means "delete on Gradle daemon exit", which might be not soon. If a single Gradle daemon runs the compiler many times, the remaining temporary files can consume quite a lot of disk space. For example, this is the case for the Kotlin build. Replace some of `.deleteOnExit()` calls with an explicit removal of temporary files at the end of a compilation session. --- .../src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 8 ++++++-- .../jetbrains/kotlin/backend/konan/KonanConfig.kt | 4 ++++ .../kotlin/org/jetbrains/kotlin/konan/TempFiles.kt | 13 +++++++++---- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 4bb428d24de..690233f698e 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -85,8 +85,12 @@ class K2Native : CLICompiler() { try { val konanConfig = KonanConfig(project, configuration) - ensureModuleName(konanConfig, environment) - runTopLevelPhases(konanConfig, environment) + try { + ensureModuleName(konanConfig, environment) + runTopLevelPhases(konanConfig, environment) + } finally { + konanConfig.dispose() + } } catch (e: Throwable) { if (e is KonanCompilationException || e is CompilationErrorException) return ExitCode.COMPILATION_ERROR diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index ba4362ff9ca..192ce45f5e8 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -29,6 +29,10 @@ import org.jetbrains.kotlin.utils.addToStdlib.cast class KonanConfig(val project: Project, val configuration: CompilerConfiguration) { + fun dispose() { + tempFiles.dispose() + } + internal val distribution = run { val overridenProperties = mutableMapOf().apply { configuration.get(KonanConfigKeys.OVERRIDE_KONAN_PROPERTIES)?.let(this::putAll) diff --git a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt index 63fcef8ca12..fc78c37ee12 100644 --- a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt +++ b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt @@ -23,6 +23,13 @@ import org.jetbrains.kotlin.konan.file.* * If pathToTemporaryDir is given and is not empty then temporary outputs will be preserved */ class TempFiles(outputPath: String, pathToTemporaryDir: String? = null) { + fun dispose() { + if (deleteOnExit) { + // Note: this can throw an exception if a file deletion is failed for some reason (e.g. OS is Windows and the file is in use). + dir.deleteRecursively() + } + } + private val outputName = File(outputPath).name val deleteOnExit = pathToTemporaryDir == null || pathToTemporaryDir.isEmpty() @@ -36,7 +43,7 @@ class TempFiles(outputPath: String, pathToTemporaryDir: String? = null) { private val dir by lazy { if (deleteOnExit) { - createTempDir("konan_temp").deleteOnExit() + createTempDir("konan_temp") } else { createDirForTemporaryFiles(pathToTemporaryDir!!) } @@ -55,8 +62,6 @@ class TempFiles(outputPath: String, pathToTemporaryDir: String? = null) { * Create file named {name}{suffix} inside temporary dir */ fun create(prefix: String, suffix: String = ""): File = - File(dir, "$prefix$suffix").also { - if (deleteOnExit) it.deleteOnExit() - } + File(dir, "$prefix$suffix") }