diff --git a/kotlin-native/runtime/src/gc/common/cpp/GCScheduler.cpp b/kotlin-native/runtime/src/gc/common/cpp/GCScheduler.cpp index 02153f40c6c..1e774a76753 100644 --- a/kotlin-native/runtime/src/gc/common/cpp/GCScheduler.cpp +++ b/kotlin-native/runtime/src/gc/common/cpp/GCScheduler.cpp @@ -164,7 +164,6 @@ class GCSchedulerDataAggressive : public gc::GCSchedulerData { public: GCSchedulerDataAggressive(gc::GCSchedulerConfig& config, std::function scheduleGC) noexcept : scheduleGC_(std::move(scheduleGC)) { - RuntimeLogInfo({kTagGC}, "Initialize GC scheduler config in the aggressive mode"); // TODO: Make it even more aggressive and run on a subset of backend.native tests. config.threshold = 1000; config.allocationThresholdBytes = 10000; @@ -188,12 +187,16 @@ KStdUniquePtr kotlin::gc::internal::MakeGCSchedulerData( std::function()> currentTimeProvider) noexcept { switch (type) { case SchedulerType::kDisabled: + RuntimeLogDebug({kTagGC}, "GC scheduler disabled"); return ::make_unique(); case SchedulerType::kWithTimer: + RuntimeLogDebug({kTagGC}, "Initializing timer-based GC scheduler"); return ::make_unique(config, std::move(scheduleGC), std::move(currentTimeProvider)); case SchedulerType::kOnSafepoints: + RuntimeLogDebug({kTagGC}, "Initializing safe-point-based GC scheduler"); return ::make_unique(config, std::move(scheduleGC), std::move(currentTimeProvider)); case SchedulerType::kAggressive: + RuntimeLogDebug({kTagGC}, "Initializing aggressive GC scheduler"); return ::make_unique(config, std::move(scheduleGC)); } } diff --git a/native/native.tests/build.gradle.kts b/native/native.tests/build.gradle.kts index 8aeaac075a5..1b8f269615b 100644 --- a/native/native.tests/build.gradle.kts +++ b/native/native.tests/build.gradle.kts @@ -53,6 +53,7 @@ enum class TestProperty(shortName: String) { MEMORY_MODEL("memoryModel"), USE_THREAD_STATE_CHECKER("useThreadStateChecker"), GC_TYPE("gcType"), + GC_SCHEDULER("gcScheduler"), USE_CACHE("useCache"), // TODO: legacy, need to remove it CACHE_MODE("cacheMode"), EXECUTION_TIMEOUT("executionTimeout"); @@ -119,6 +120,7 @@ fun nativeTest(taskName: String, vararg tags: String) = projectTest(taskName, jU TestProperty.MEMORY_MODEL.setUpFromGradleProperty(this) TestProperty.USE_THREAD_STATE_CHECKER.setUpFromGradleProperty(this) TestProperty.GC_TYPE.setUpFromGradleProperty(this) + TestProperty.GC_SCHEDULER.setUpFromGradleProperty(this) TestProperty.USE_CACHE.setUpFromGradleProperty(this) TestProperty.CACHE_MODE.setUpFromGradleProperty(this) TestProperty.EXECUTION_TIMEOUT.setUpFromGradleProperty(this) diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/ConfigurationProperties.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/ConfigurationProperties.kt index 26225b50aa1..51634d649f8 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/ConfigurationProperties.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/ConfigurationProperties.kt @@ -38,6 +38,7 @@ internal enum class ClassLevelProperty(shortName: String) { MEMORY_MODEL("memoryModel"), USE_THREAD_STATE_CHECKER("useThreadStateChecker"), GC_TYPE("gcType"), + GC_SCHEDULER("gcScheduler"), CACHE_MODE("cacheMode"), EXECUTION_TIMEOUT("executionTimeout"); diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeTestSupport.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeTestSupport.kt index 5d3a60f7818..1021dc0b4aa 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeTestSupport.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeTestSupport.kt @@ -132,6 +132,13 @@ private object NativeTestSupport { } } + val gcScheduler = computeGCScheduler(enforcedProperties) + if (gcScheduler != GCScheduler.UNSPECIFIED) { + assertEquals(MemoryModel.EXPERIMENTAL, memoryModel) { + "GC scheduler can be specified only with experimental memory model" + } + } + val nativeHome = getOrCreateTestProcessSettings().get() val hostManager = HostManager(distribution = Distribution(nativeHome.dir.path), experimental = false) @@ -141,6 +148,7 @@ private object NativeTestSupport { output += memoryModel output += threadStateChecker output += gcType + output += gcScheduler output += nativeTargets output += CacheMode::class to computeCacheMode(enforcedProperties, nativeHome, nativeTargets, optimizationMode) output += computeTestMode(enforcedProperties) @@ -168,6 +176,9 @@ private object NativeTestSupport { private fun computeGCType(enforcedProperties: EnforcedProperties): GCType = ClassLevelProperty.GC_TYPE.readValue(enforcedProperties, GCType.values(), default = GCType.UNSPECIFIED) + private fun computeGCScheduler(enforcedProperties: EnforcedProperties): GCScheduler = + ClassLevelProperty.GC_SCHEDULER.readValue(enforcedProperties, GCScheduler.values(), default = GCScheduler.UNSPECIFIED) + private fun computeNativeTargets(enforcedProperties: EnforcedProperties, hostManager: HostManager): KotlinNativeTargets { val hostTarget = HostManager.host return KotlinNativeTargets( diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/compilation/TestCompilation.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/compilation/TestCompilation.kt index 3d94181730c..4b2492aeb07 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/compilation/TestCompilation.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/compilation/TestCompilation.kt @@ -143,6 +143,7 @@ internal abstract class SourceBasedCompilation( private val memoryModel: MemoryModel, private val threadStateChecker: ThreadStateChecker, private val gcType: GCType, + private val gcScheduler: GCScheduler, freeCompilerArgs: TestCompilerArgs, override val sourceModules: Collection, dependencies: Iterable>, @@ -161,6 +162,7 @@ internal abstract class SourceBasedCompilation( memoryModel.compilerFlags?.let { compilerFlags -> add(compilerFlags) } threadStateChecker.compilerFlag?.let { compilerFlag -> add(compilerFlag) } gcType.compilerFlag?.let { compilerFlag -> add(compilerFlag) } + gcScheduler.compilerFlag?.let { compilerFlag -> add(compilerFlag) } } override fun applyDependencies(argsBuilder: ArgsBuilder): Unit = with(argsBuilder) { @@ -192,6 +194,7 @@ internal class LibraryCompilation( memoryModel = settings.get(), threadStateChecker = settings.get(), gcType = settings.get(), + gcScheduler = settings.get(), freeCompilerArgs = freeCompilerArgs, sourceModules = sourceModules, dependencies = dependencies, @@ -221,6 +224,7 @@ internal class ExecutableCompilation( memoryModel = settings.get(), threadStateChecker = settings.get(), gcType = settings.get(), + gcScheduler = settings.get(), freeCompilerArgs = freeCompilerArgs, sourceModules = sourceModules, dependencies = dependencies, diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt index 1173c233d80..c7370df535f 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt @@ -93,6 +93,16 @@ internal enum class GCType(val compilerFlag: String?) { override fun toString() = compilerFlag?.let { "($it)" }.orEmpty() } +internal enum class GCScheduler(val compilerFlag: String?) { + UNSPECIFIED(null), + DISABLED("-Xbinary=gcSchedulerType=disabled"), + WITH_TIMER("-Xbinary=gcSchedulerType=with_timer"), + ON_SAFE_POINTS("-Xbinary=gcSchedulerType=on_safe_points"), + AGGRESSIVE("-Xbinary=gcSchedulerType=aggressive"); + + override fun toString() = compilerFlag?.let { "($it)" }.orEmpty() +} + /** * Current project's directories. */