diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BinaryOptions.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BinaryOptions.kt index ceee203ab64..b916d71daae 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BinaryOptions.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BinaryOptions.kt @@ -40,6 +40,8 @@ object BinaryOptions : BinaryOptionRegistry() { val appStateTracking by option() val sanitizer by option() + + val mimallocUseDefaultOptions by booleanOption() } open class BinaryOption( 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 25d86ba8ab3..e9d56ce0687 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 @@ -181,6 +181,10 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration configuration.get(BinaryOptions.appStateTracking) ?: AppStateTracking.DISABLED } + val mimallocUseDefaultOptions by lazy { + configuration.get(BinaryOptions.mimallocUseDefaultOptions) ?: false + } + init { if (!platformManager.isEnabled(target)) { error("Target ${target.visibleName} is not available on the ${HostManager.hostName} host") diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 3f14c41cc0c..05f7b4e469b 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -2792,6 +2792,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map(Kotlin_destroyRuntimeMode); @@ -58,3 +59,7 @@ ALWAYS_INLINE int compiler::getSourceInfo(void* addr, SourceInfo *result, int re return Kotlin_getSourceInfo_Function(addr, result, result_size); } } + +ALWAYS_INLINE bool compiler::mimallocUseDefaultOptions() noexcept { + return Kotlin_mimallocUseDefaultOptions != 0; +} diff --git a/kotlin-native/runtime/src/main/cpp/CompilerConstants.hpp b/kotlin-native/runtime/src/main/cpp/CompilerConstants.hpp index ca4a3739e4d..15cf8ff084e 100644 --- a/kotlin-native/runtime/src/main/cpp/CompilerConstants.hpp +++ b/kotlin-native/runtime/src/main/cpp/CompilerConstants.hpp @@ -108,6 +108,7 @@ DestroyRuntimeMode destroyRuntimeMode() noexcept; bool suspendFunctionsFromAnyThreadFromObjCEnabled() noexcept; AppStateTracking appStateTracking() noexcept; int getSourceInfo(void* addr, SourceInfo *result, int result_size) noexcept; +bool mimallocUseDefaultOptions() noexcept; #ifdef KONAN_ANDROID bool printToAndroidLogcat() noexcept; diff --git a/kotlin-native/runtime/src/opt_alloc/cpp/ObjectAlloc.cpp b/kotlin-native/runtime/src/opt_alloc/cpp/ObjectAlloc.cpp index 020dafad9af..c27cbb2f584 100644 --- a/kotlin-native/runtime/src/opt_alloc/cpp/ObjectAlloc.cpp +++ b/kotlin-native/runtime/src/opt_alloc/cpp/ObjectAlloc.cpp @@ -5,12 +5,24 @@ #include "ObjectAlloc.hpp" +#include + #include "../../mimalloc/c/include/mimalloc.h" #include "Alignment.hpp" +#include "CompilerConstants.hpp" using namespace kotlin; +namespace { + +std::once_flag initOptions; + +} + void kotlin::initObjectPool() noexcept { + if (!compiler::mimallocUseDefaultOptions()) { + std::call_once(initOptions, [] { mi_option_enable(mi_option_reset_decommits); }); + } mi_thread_init(); }