[K/N] Move kotlin.native.internal.GC into kotlin.native.runtime As a part of efforts to stabilize Native stdlib #KT-55765.
diff --git a/kotlin-native/backend.native/tests/framework/stdlib/stdlib.kt b/kotlin-native/backend.native/tests/framework/stdlib/stdlib.kt index e2f810e..24d6538 100644 --- a/kotlin-native/backend.native/tests/framework/stdlib/stdlib.kt +++ b/kotlin-native/backend.native/tests/framework/stdlib/stdlib.kt
@@ -4,6 +4,7 @@ */ @file:Suppress("UNUSED") +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) package stdlib @@ -63,7 +64,7 @@ } } -fun gc() = kotlin.native.internal.GC.collect() +fun gc() = kotlin.native.runtime.GC.collect() // Note: this method checks only some of the operations (namely the ones modified recently, // and thus required additional tests).
diff --git a/kotlin-native/backend.native/tests/interop/cleaners/cleaners.kt b/kotlin-native/backend.native/tests/interop/cleaners/cleaners.kt index f430ccc..7911eb1 100644 --- a/kotlin-native/backend.native/tests/interop/cleaners/cleaners.kt +++ b/kotlin-native/backend.native/tests/interop/cleaners/cleaners.kt
@@ -2,9 +2,10 @@ * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ -@file:OptIn(ExperimentalStdlibApi::class) +@file:OptIn(ExperimentalStdlibApi::class, kotlin.native.runtime.NativeRuntimeApi::class) import kotlin.native.internal.* +import kotlin.native.runtime.GC fun ensureInitialized() {}
diff --git a/kotlin-native/backend.native/tests/interop/kt44283/main.kt b/kotlin-native/backend.native/tests/interop/kt44283/main.kt index 77b15b1..09a5855 100644 --- a/kotlin-native/backend.native/tests/interop/kt44283/main.kt +++ b/kotlin-native/backend.native/tests/interop/kt44283/main.kt
@@ -1,3 +1,5 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlinx.cinterop.* import kt44283.* import kotlin.native.concurrent.AtomicInt @@ -7,7 +9,7 @@ fun main() { val func = staticCFunction<CValue<TestStruct>, Unit> { - kotlin.native.internal.GC.collect() // Helps to ensure that "runtime" is already initialized. + kotlin.native.runtime.GC.collect() // Helps to ensure that "runtime" is already initialized. memScoped { println("Hello, Kotlin/Native! ${it.ptr.pointed.d}")
diff --git a/kotlin-native/backend.native/tests/interop/objc/smoke.kt b/kotlin-native/backend.native/tests/interop/objc/smoke.kt index 934acff..1dd71a6 100644 --- a/kotlin-native/backend.native/tests/interop/objc/smoke.kt +++ b/kotlin-native/backend.native/tests/interop/objc/smoke.kt
@@ -2,6 +2,7 @@ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) import kotlinx.cinterop.* import objcSmoke.* @@ -204,7 +205,7 @@ autoreleasepool { test() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } assertFalse(unexpectedDeallocation)
diff --git a/kotlin-native/backend.native/tests/interop/objc/smoke_noopgc.kt b/kotlin-native/backend.native/tests/interop/objc/smoke_noopgc.kt index 934acff..1dd71a6 100644 --- a/kotlin-native/backend.native/tests/interop/objc/smoke_noopgc.kt +++ b/kotlin-native/backend.native/tests/interop/objc/smoke_noopgc.kt
@@ -2,6 +2,7 @@ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) import kotlinx.cinterop.* import objcSmoke.* @@ -204,7 +205,7 @@ autoreleasepool { test() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } assertFalse(unexpectedDeallocation)
diff --git a/kotlin-native/backend.native/tests/interop/objc/tests/customString.kt b/kotlin-native/backend.native/tests/interop/objc/tests/customString.kt index 6b90633..7e022b2 100644 --- a/kotlin-native/backend.native/tests/interop/objc/tests/customString.kt +++ b/kotlin-native/backend.native/tests/interop/objc/tests/customString.kt
@@ -1,3 +1,5 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlinx.cinterop.* import kotlin.test.* import objcTests.* @@ -13,7 +15,7 @@ } test() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(customStringDeallocated) }
diff --git a/kotlin-native/backend.native/tests/interop/objc/tests/kt41811.kt b/kotlin-native/backend.native/tests/interop/objc/tests/kt41811.kt index cc7b7b6..752f0dc 100644 --- a/kotlin-native/backend.native/tests/interop/objc/tests/kt41811.kt +++ b/kotlin-native/backend.native/tests/interop/objc/tests/kt41811.kt
@@ -1,3 +1,5 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlin.native.ref.WeakReference import kotlinx.cinterop.* import kotlin.test.* @@ -9,7 +11,7 @@ @Test fun testKT41811() { // Attempt to make the state predictable: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() deallocRetainReleaseDeallocated = false assertFalse(deallocRetainReleaseDeallocated) @@ -17,12 +19,12 @@ createGarbageDeallocRetainRelease() // Runs [DeallocRetainRelease dealloc]: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(deallocRetainReleaseDeallocated) // Might crash due to double-dispose if the dealloc applied addRef/releaseRef to reclaimed Kotlin object: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } private fun createGarbageDeallocRetainRelease() { @@ -55,7 +57,7 @@ private fun testKT41811LoadWeak(weakRef: WeakReferenceProtocol) { // Attempt to make the state predictable: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() deallocLoadWeakDeallocated = false assertFalse(deallocLoadWeakDeallocated) @@ -63,12 +65,12 @@ createGarbageDeallocLoadWeak(weakRef) // Runs [DeallocLoadWeak dealloc]: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(deallocLoadWeakDeallocated) // Might crash due to double-dispose if the dealloc applied addRef/releaseRef to reclaimed Kotlin object: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() weakDeallocLoadWeak = null } @@ -85,7 +87,7 @@ @Test fun testKT41811WithGlobal() { // Attempt to make the state predictable: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() deallocRetainReleaseDeallocated = false assertFalse(deallocRetainReleaseDeallocated) @@ -99,7 +101,7 @@ assertFalse(deallocRetainReleaseDeallocated) // Clean up local DeallocRetainRelease on Kotlin side - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertFalse(deallocRetainReleaseDeallocated) @@ -112,7 +114,7 @@ // on ObjC side, which triggers `retain` and `release` of `self`. If these messages // were to reach Kotlin side, the `release` would have immediately scheduled the // second disposal of Kotlin object. - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(deallocRetainReleaseDeallocated) }
diff --git a/kotlin-native/backend.native/tests/interop/objc/tests/kt42482.kt b/kotlin-native/backend.native/tests/interop/objc/tests/kt42482.kt index 6fce89b..98af007 100644 --- a/kotlin-native/backend.native/tests/interop/objc/tests/kt42482.kt +++ b/kotlin-native/backend.native/tests/interop/objc/tests/kt42482.kt
@@ -1,3 +1,5 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlin.native.ref.WeakReference import kotlinx.cinterop.* import kotlin.test.* @@ -6,7 +8,7 @@ @Test fun testKT42482() { // Attempt to make the state predictable: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() kt42482Deallocated = false assertFalse(kt42482Deallocated); @@ -25,7 +27,7 @@ kt42482Global = null }() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(kt42482Deallocated) }
diff --git a/kotlin-native/backend.native/tests/interop/objc/tests/objcWeakRefs.kt b/kotlin-native/backend.native/tests/interop/objc/tests/objcWeakRefs.kt index 69317de..4f2ea27 100644 --- a/kotlin-native/backend.native/tests/interop/objc/tests/objcWeakRefs.kt +++ b/kotlin-native/backend.native/tests/interop/objc/tests/objcWeakRefs.kt
@@ -1,4 +1,4 @@ -@file:OptIn(FreezingIsDeprecated::class) +@file:OptIn(FreezingIsDeprecated::class, kotlin.native.runtime.NativeRuntimeApi::class) import kotlinx.cinterop.* import kotlin.native.concurrent.* @@ -16,7 +16,7 @@ testObjCWeakRef0(deallocListener) } - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(deallocListener.deallocated) assertTrue(deallocListener.deallocExecutorIsNil()) } @@ -47,6 +47,6 @@ assertFalse(deallocListener.deallocExecutorIsNil()) } // Process release of Kotlin reference to [obj] in any case: - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } }
diff --git a/kotlin-native/backend.native/tests/interop/objc/tests/tryRetainGC.kt b/kotlin-native/backend.native/tests/interop/objc/tests/tryRetainGC.kt index 21f17d5..dd499e2 100644 --- a/kotlin-native/backend.native/tests/interop/objc/tests/tryRetainGC.kt +++ b/kotlin-native/backend.native/tests/interop/objc/tests/tryRetainGC.kt
@@ -1,10 +1,12 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlinx.cinterop.* import kotlin.test.* import objcTests.* @Test fun testTryRetainGC() { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() val weakRefHolder = WeakRefHolder() createGarbageNSObjects(weakRefHolder) weakRefHolder.obj = object : NSObject() {}
diff --git a/kotlin-native/backend.native/tests/interop/objc/tests/weakRefs.kt b/kotlin-native/backend.native/tests/interop/objc/tests/weakRefs.kt index fa714be..3d86322 100644 --- a/kotlin-native/backend.native/tests/interop/objc/tests/weakRefs.kt +++ b/kotlin-native/backend.native/tests/interop/objc/tests/weakRefs.kt
@@ -1,3 +1,5 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlin.native.ref.* import kotlinx.cinterop.* import kotlin.test.* @@ -16,7 +18,7 @@ createAndTestWeakReference(block) } - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertNull(ref.get()) }
diff --git a/kotlin-native/backend.native/tests/objcexport/coroutines.kt b/kotlin-native/backend.native/tests/objcexport/coroutines.kt index 769b23a..6e52599 100644 --- a/kotlin-native/backend.native/tests/objcexport/coroutines.kt +++ b/kotlin-native/backend.native/tests/objcexport/coroutines.kt
@@ -2,6 +2,7 @@ * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) package coroutines @@ -243,4 +244,4 @@ fun createCoroutineUninterceptedAndResume(fn: suspend Any?.() -> Any?, receiver: Any?, resultHolder: ResultHolder<Any?>) = fn.createCoroutine(receiver, ResultHolderCompletion(resultHolder)).resume(Unit) -fun gc() = kotlin.native.internal.GC.collect() +fun gc() = kotlin.native.runtime.GC.collect()
diff --git a/kotlin-native/backend.native/tests/objcexport/deallocRetain.kt b/kotlin-native/backend.native/tests/objcexport/deallocRetain.kt index 5adf944..5ed8b84 100644 --- a/kotlin-native/backend.native/tests/objcexport/deallocRetain.kt +++ b/kotlin-native/backend.native/tests/objcexport/deallocRetain.kt
@@ -7,7 +7,8 @@ open class DeallocRetainBase -fun garbageCollect() = kotlin.native.internal.GC.collect() +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) +fun garbageCollect() = kotlin.native.runtime.GC.collect() fun createWeakReference(value: Any) = kotlin.native.ref.WeakReference(value)
diff --git a/kotlin-native/backend.native/tests/objcexport/noAutorelease.kt b/kotlin-native/backend.native/tests/objcexport/noAutorelease.kt index cb2c8d1..652ac29 100644 --- a/kotlin-native/backend.native/tests/objcexport/noAutorelease.kt +++ b/kotlin-native/backend.native/tests/objcexport/noAutorelease.kt
@@ -19,7 +19,8 @@ fun objectsAreDead() = weakRefs.all { it.value === null } } -fun gc() = kotlin.native.internal.GC.collect() +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) +fun gc() = kotlin.native.runtime.GC.collect() class KotlinObject
diff --git a/kotlin-native/backend.native/tests/objcexport/values.kt b/kotlin-native/backend.native/tests/objcexport/values.kt index cd01527..6feabe7 100644 --- a/kotlin-native/backend.native/tests/objcexport/values.kt +++ b/kotlin-native/backend.native/tests/objcexport/values.kt
@@ -5,7 +5,7 @@ // All classes and methods should be used in tests @file:Suppress("UNUSED") -@file:OptIn(FreezingIsDeprecated::class) +@file:OptIn(FreezingIsDeprecated::class, kotlin.native.runtime.NativeRuntimeApi::class) package conversions @@ -807,7 +807,7 @@ @Deprecated("warning", level = DeprecationLevel.WARNING) var warningVar: Any? = null fun gc() { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } class TestWeakRefs(private val frozen: Boolean) { @@ -862,7 +862,7 @@ fun createFrozenCollection() = createCollection().freeze() fun hasAliveObjects(): Boolean { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() return mustBeRemoved.any { it.get() != null } }
diff --git a/kotlin-native/backend.native/tests/runtime/basic/cleaner_basic.kt b/kotlin-native/backend.native/tests/runtime/basic/cleaner_basic.kt index 9678ae6d..8aa90a0 100644 --- a/kotlin-native/backend.native/tests/runtime/basic/cleaner_basic.kt +++ b/kotlin-native/backend.native/tests/runtime/basic/cleaner_basic.kt
@@ -2,7 +2,7 @@ * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ -@file:OptIn(ExperimentalStdlibApi::class, FreezingIsDeprecated::class) +@file:OptIn(ExperimentalStdlibApi::class, FreezingIsDeprecated::class, kotlin.native.runtime.NativeRuntimeApi::class) package runtime.basic.cleaner_basic @@ -13,6 +13,7 @@ import kotlin.native.ref.WeakReference import kotlin.native.ref.Cleaner import kotlin.native.ref.createCleaner +import kotlin.native.runtime.GC class AtomicBoolean(initialValue: Boolean) { private val impl = AtomicInt(if (initialValue) 1 else 0)
diff --git a/kotlin-native/backend.native/tests/runtime/basic/cleaner_in_tls_worker.kt b/kotlin-native/backend.native/tests/runtime/basic/cleaner_in_tls_worker.kt index 6d0a4b7..9ff8f7e 100644 --- a/kotlin-native/backend.native/tests/runtime/basic/cleaner_in_tls_worker.kt +++ b/kotlin-native/backend.native/tests/runtime/basic/cleaner_in_tls_worker.kt
@@ -2,7 +2,7 @@ * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ -@file:OptIn(ExperimentalStdlibApi::class) +@file:OptIn(ExperimentalStdlibApi::class, kotlin.native.runtime.NativeRuntimeApi::class) import kotlin.test.* @@ -10,6 +10,7 @@ import kotlin.native.internal.* import kotlin.native.ref.Cleaner import kotlin.native.ref.createCleaner +import kotlin.native.runtime.GC @ThreadLocal var tlsCleaner: Cleaner? = null
diff --git a/kotlin-native/backend.native/tests/runtime/basic/cleaner_workers.kt b/kotlin-native/backend.native/tests/runtime/basic/cleaner_workers.kt index 3b759c9..5655993 100644 --- a/kotlin-native/backend.native/tests/runtime/basic/cleaner_workers.kt +++ b/kotlin-native/backend.native/tests/runtime/basic/cleaner_workers.kt
@@ -2,7 +2,7 @@ * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ -@file:OptIn(ExperimentalStdlibApi::class, FreezingIsDeprecated::class, kotlin.experimental.ExperimentalNativeApi::class) +@file:OptIn(ExperimentalStdlibApi::class, FreezingIsDeprecated::class, kotlin.experimental.ExperimentalNativeApi::class, kotlin.native.runtime.NativeRuntimeApi::class) package runtime.basic.cleaner_workers @@ -13,6 +13,7 @@ import kotlin.native.ref.WeakReference import kotlin.native.ref.Cleaner import kotlin.native.ref.createCleaner +import kotlin.native.runtime.GC class AtomicBoolean(initialValue: Boolean) { private val impl = AtomicInt(if (initialValue) 1 else 0)
diff --git a/kotlin-native/backend.native/tests/runtime/collections/hash_map1.kt b/kotlin-native/backend.native/tests/runtime/collections/hash_map1.kt index 166f2ec..eb5c46b 100644 --- a/kotlin-native/backend.native/tests/runtime/collections/hash_map1.kt +++ b/kotlin-native/backend.native/tests/runtime/collections/hash_map1.kt
@@ -7,7 +7,6 @@ import kotlin.native.MemoryModel import kotlin.native.Platform -import kotlin.native.internal.GC import kotlin.test.* fun assertTrue(cond: Boolean) {
diff --git a/kotlin-native/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt b/kotlin-native/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt index 6bb5eaf..d3b2fb7 100644 --- a/kotlin-native/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt +++ b/kotlin-native/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt
@@ -2,16 +2,16 @@ * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ -@file:OptIn(FreezingIsDeprecated::class) +@file:OptIn(FreezingIsDeprecated::class, kotlin.native.runtime.NativeRuntimeApi::class) package runtime.concurrent.worker_bound_reference0 import kotlin.test.* import kotlin.native.concurrent.* -import kotlin.native.internal.GC import kotlin.native.* import kotlin.native.ref.WeakReference +import kotlin.native.runtime.GC import kotlin.text.Regex class A(var a: Int)
diff --git a/kotlin-native/backend.native/tests/runtime/memory/cycle_collector.kt b/kotlin-native/backend.native/tests/runtime/memory/cycle_collector.kt index 484e560..4b06cff 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/cycle_collector.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/cycle_collector.kt
@@ -1,5 +1,7 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlin.native.concurrent.* -import kotlin.native.internal.GC +import kotlin.native.runtime.GC import kotlin.native.Platform import kotlin.test.* @@ -44,15 +46,15 @@ fun test4() { val holder = makeIt() // To clean rc count coming from rememberNewContainer(). - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() // Request cyclic collection. - kotlin.native.internal.GC.collectCyclic() + kotlin.native.runtime.GC.collectCyclic() // Ensure we processed delayed release. repeat(10) { // Wait a bit and process queue. Worker.current.park(10) Worker.current.processQueue() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } val value = @Suppress("UNCHECKED_CAST") (holder.other as? AtomicReference<Holder?>?) assertTrue(value != null) @@ -77,15 +79,15 @@ fun test5() { val holder = createHolder2() - kotlin.native.internal.GC.collect() - kotlin.native.internal.GC.collectCyclic() + kotlin.native.runtime.GC.collect() + kotlin.native.runtime.GC.collectCyclic() Worker.current.park(100 * 1000) holder.switch() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() Worker.current.park(100 * 1000) withWorker { executeAfter(0L, { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() }.freeze()) } Worker.current.park(1000) @@ -109,9 +111,9 @@ fun test7() { val ref1 = createRoot() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() - kotlin.native.internal.GC.collectCyclic() + kotlin.native.runtime.GC.collectCyclic() Worker.current.park(500 * 1000L) withWorker { @@ -177,7 +179,7 @@ fun main() { Platform.isMemoryLeakCheckerActive = true - kotlin.native.internal.GC.cyclicCollectorEnabled = true + kotlin.native.runtime.GC.cyclicCollectorEnabled = true test1() test2() test3()
diff --git a/kotlin-native/backend.native/tests/runtime/memory/cycle_collector_deadlock1.kt b/kotlin-native/backend.native/tests/runtime/memory/cycle_collector_deadlock1.kt index 3b7c32d..2161011 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/cycle_collector_deadlock1.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/cycle_collector_deadlock1.kt
@@ -1,9 +1,9 @@ import kotlin.native.concurrent.* -import kotlin.native.internal.GC import kotlin.test.* +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) fun main() { - kotlin.native.internal.GC.cyclicCollectorEnabled = true + kotlin.native.runtime.GC.cyclicCollectorEnabled = true repeat(10000) { // Create atomic cyclic garbage:
diff --git a/kotlin-native/backend.native/tests/runtime/memory/cycle_detector.kt b/kotlin-native/backend.native/tests/runtime/memory/cycle_detector.kt index 668c924..52cb14c 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/cycle_detector.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/cycle_detector.kt
@@ -1,5 +1,7 @@ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlin.native.concurrent.* -import kotlin.native.internal.GC +import kotlin.native.runtime.GC import kotlin.native.Platform import kotlin.test.*
diff --git a/kotlin-native/backend.native/tests/runtime/memory/cycles0.kt b/kotlin-native/backend.native/tests/runtime/memory/cycles0.kt index b2d09fd..838a195 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/cycles0.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/cycles0.kt
@@ -44,11 +44,12 @@ } +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) @Test fun runTest() { // Create outer link from cyclic garbage. val outer = Node(42, null, null, null) createCycles(outer) - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() // Ensure outer is not collected. println(outer.data) }
diff --git a/kotlin-native/backend.native/tests/runtime/memory/cycles1.kt b/kotlin-native/backend.native/tests/runtime/memory/cycles1.kt index 9dc33ea..1f43c3a 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/cycles1.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/cycles1.kt
@@ -10,11 +10,12 @@ import kotlin.test.* import kotlin.native.ref.* +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) @Test fun runTest() { // TODO: make it work in relaxed model as well. if (Platform.memoryModel == MemoryModel.RELAXED) return val weakRefToTrashCycle = createLoop() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertNull(weakRefToTrashCycle.get()) }
diff --git a/kotlin-native/backend.native/tests/runtime/memory/gcStats.kt b/kotlin-native/backend.native/tests/runtime/memory/gcStats.kt index 1078c3d..15364da 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/gcStats.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/gcStats.kt
@@ -3,9 +3,9 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:OptIn(kotlin.ExperimentalStdlibApi::class) +@file:OptIn(kotlin.ExperimentalStdlibApi::class, kotlin.native.runtime.NativeRuntimeApi::class) -import kotlin.native.internal.GC +import kotlin.native.runtime.GC import kotlin.test.*
diff --git a/kotlin-native/backend.native/tests/runtime/memory/only_gc.kt b/kotlin-native/backend.native/tests/runtime/memory/only_gc.kt index df04646..97349d5 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/only_gc.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/only_gc.kt
@@ -2,8 +2,8 @@ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ - +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) fun main(args: Array<String>) { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() }
diff --git a/kotlin-native/backend.native/tests/runtime/memory/stress_gc_allocations.kt b/kotlin-native/backend.native/tests/runtime/memory/stress_gc_allocations.kt index 18aefea..6fdb6aa 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/stress_gc_allocations.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/stress_gc_allocations.kt
@@ -2,6 +2,8 @@ * Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) + import kotlin.test.* import kotlin.native.concurrent.* @@ -58,8 +60,8 @@ val progressReportsCount = 100 if (Platform.memoryModel == MemoryModel.EXPERIMENTAL) { - kotlin.native.internal.GC.autotune = false - kotlin.native.internal.GC.targetHeapBytes = retainLimit + kotlin.native.runtime.GC.autotune = false + kotlin.native.runtime.GC.targetHeapBytes = retainLimit } // On Linux, the child process might immediately commit the same amount of memory as the parent.
diff --git a/kotlin-native/backend.native/tests/runtime/memory/weak0.kt b/kotlin-native/backend.native/tests/runtime/memory/weak0.kt index 0c8cecf..57a97bb 100644 --- a/kotlin-native/backend.native/tests/runtime/memory/weak0.kt +++ b/kotlin-native/backend.native/tests/runtime/memory/weak0.kt
@@ -28,15 +28,16 @@ return weaks } +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) @Test fun runTest() { val weak = localWeak() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() val value = weak.get() println(value?.toString()) val weaks = multiWeak() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() weaks.forEach { it -> if (it.get()?.s != null) throw Error("not null")
diff --git a/kotlin-native/backend.native/tests/runtime/workers/atomic1.kt b/kotlin-native/backend.native/tests/runtime/workers/atomic1.kt index d6b065a..c99ecb2 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/atomic1.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/atomic1.kt
@@ -4,11 +4,13 @@ */ // Note: This test reproduces a race, so it'll start flaking if problem is reintroduced. +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) import kotlin.test.* import kotlin.native.concurrent.* import kotlin.native.internal.* +import kotlin.native.runtime.GC val thrashGC = AtomicInt(1) val canStartCreating = AtomicInt(0)
diff --git a/kotlin-native/backend.native/tests/runtime/workers/freeze6.kt b/kotlin-native/backend.native/tests/runtime/workers/freeze6.kt index df2ef1d..a4b5006 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/freeze6.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/freeze6.kt
@@ -2,7 +2,7 @@ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ -@file:OptIn(FreezingIsDeprecated::class) +@file:OptIn(FreezingIsDeprecated::class, kotlin.native.runtime.NativeRuntimeApi::class) package runtime.workers.freeze6 @@ -48,7 +48,7 @@ @Test fun ensureFreezableHandlesCycles1() { val ref = createRef1() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() val obj: Any = ref global = obj.hashCode() @@ -86,7 +86,7 @@ @Test fun ensureFreezableHandlesCycles2() { val (ref, obj) = createRef2() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(obj.toString().length > 0) global = ref.value!!.ref!!.hashCode() @@ -108,7 +108,7 @@ fun ensureFreezableHandlesCycles3() { val ref = createRef3() ref.value = null - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() val obj: Any = ref assertTrue(obj.toString().length > 0) @@ -133,7 +133,7 @@ ref.value = null // We cannot check weakRef.get() here, as value read will be stored in the stack slot, // and thus hold weak reference from release. - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(weakRef.get() == null) } @@ -155,6 +155,6 @@ @Test fun ensureWeakRefNotLeaks2() { createRef5() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertTrue(weakNode2.get() == null) } \ No newline at end of file
diff --git a/kotlin-native/backend.native/tests/runtime/workers/lazy2.kt b/kotlin-native/backend.native/tests/runtime/workers/lazy2.kt index 49d08ae..4cb2e70 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/lazy2.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/lazy2.kt
@@ -24,8 +24,9 @@ // initializer field in frozen lazy object led to the crash, induced by breaking frozen objects' // invariant (initializer end up in the same container as the lazy object itself, so it was destroyed // earlier than it should when reference counter was decremented). +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) fun main(args: Array<String>) { printAll() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() println("OK") } \ No newline at end of file
diff --git a/kotlin-native/backend.native/tests/runtime/workers/lazy3.kt b/kotlin-native/backend.native/tests/runtime/workers/lazy3.kt index 2f1a267..e0b634b7 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/lazy3.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/lazy3.kt
@@ -1,4 +1,4 @@ -@file:OptIn(FreezingIsDeprecated::class) +@file:OptIn(FreezingIsDeprecated::class, kotlin.native.runtime.NativeRuntimeApi::class) import kotlin.native.concurrent.* import kotlin.native.ref.* @@ -49,7 +49,7 @@ fun ensureGetsCollected(create: () -> Any) { val ref = makeWeakRef(create) - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertNull(ref.get()) }
diff --git a/kotlin-native/backend.native/tests/runtime/workers/worker10.kt b/kotlin-native/backend.native/tests/runtime/workers/worker10.kt index 8124def..25a4cf1 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/worker10.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/worker10.kt
@@ -1,4 +1,4 @@ -@file:OptIn(FreezingIsDeprecated::class, kotlin.experimental.ExperimentalNativeApi::class) +@file:OptIn(FreezingIsDeprecated::class, kotlin.experimental.ExperimentalNativeApi::class, kotlin.native.runtime.NativeRuntimeApi::class) package runtime.workers.worker10 import kotlin.test.* @@ -99,7 +99,7 @@ } while (semaphore.value != 1) {} atomicRef.value = null - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() semaphore.increment() future.result worker.requestTermination().result @@ -116,7 +116,7 @@ } while (semaphore.value != 1) {} stableRef.dispose() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() semaphore.increment() future.result worker.requestTermination().result @@ -135,12 +135,12 @@ ensureWeakIs(it, "hello" to "world") semaphore.increment() while (semaphore.value != 2) {} - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() ensureWeakIs(it, null) } while (semaphore.value != 1) {} stableHolder1.dispose() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() semaphore.increment() future.result worker.requestTermination().result @@ -155,12 +155,12 @@ val value = it.get() semaphore.increment() while (semaphore.value != 2) {} - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() assertEquals("hello" to "world", value) } while (semaphore.value != 1) {} stableHolder2.dispose() - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() semaphore.increment() future.result worker.requestTermination().result @@ -178,7 +178,7 @@ } while (semaphore.value != 1) {} atomicRef2.value = null - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() semaphore.increment() future.result worker.requestTermination().result
diff --git a/kotlin-native/backend.native/tests/runtime/workers/worker9.kt b/kotlin-native/backend.native/tests/runtime/workers/worker9.kt index cc17154..d8db459 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/worker9.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/worker9.kt
@@ -80,12 +80,13 @@ return outer } +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) @Test fun runTest4() { val worker = Worker.start() val future = worker.execute(TransferMode.SAFE, { }) { makeCyclic().also { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } } assert(future.result != null)
diff --git a/kotlin-native/backend.native/tests/runtime/workers/worker9_experimentalMM.kt b/kotlin-native/backend.native/tests/runtime/workers/worker9_experimentalMM.kt index ee41170..42a4a97 100644 --- a/kotlin-native/backend.native/tests/runtime/workers/worker9_experimentalMM.kt +++ b/kotlin-native/backend.native/tests/runtime/workers/worker9_experimentalMM.kt
@@ -78,12 +78,13 @@ return outer } +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) @Test fun runTest4() { val worker = Worker.start() val future = worker.execute(TransferMode.SAFE, { }) { makeCyclic().also { - kotlin.native.internal.GC.collect() + kotlin.native.runtime.GC.collect() } } assert(future.result != null)
diff --git a/kotlin-native/performance/ring/src/main/kotlin-native/cleanup.kt b/kotlin-native/performance/ring/src/main/kotlin-native/cleanup.kt index a27ad95..65b5c98 100644 --- a/kotlin-native/performance/ring/src/main/kotlin-native/cleanup.kt +++ b/kotlin-native/performance/ring/src/main/kotlin-native/cleanup.kt
@@ -1,5 +1,6 @@ package org.jetbrains.ring -import kotlin.native.internal.GC +import kotlin.native.runtime.GC +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) actual fun cleanup() { GC.collect() } \ No newline at end of file
diff --git a/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/WeakRefBenchmark.kt b/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/WeakRefBenchmark.kt index 52508ce..57f23aa 100644 --- a/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/WeakRefBenchmark.kt +++ b/kotlin-native/performance/ring/src/main/kotlin/org/jetbrains/ring/WeakRefBenchmark.kt
@@ -5,7 +5,7 @@ package org.jetbrains.ring -import kotlin.native.internal.GC +import kotlin.native.runtime.GC import kotlin.native.ref.WeakReference import kotlin.test.assertEquals import kotlin.test.assertNotEquals @@ -46,6 +46,7 @@ this.value } +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) open class WeakRefBenchmark { private val aliveRef = ReferenceWrapper.create() private val deadRef = ReferenceWrapper.create().apply {
diff --git a/kotlin-native/performance/shared/src/main/kotlin-native/common/org/jetbrains/benchmarksLauncher/Utils.kt b/kotlin-native/performance/shared/src/main/kotlin-native/common/org/jetbrains/benchmarksLauncher/Utils.kt index 7de3673..c55ade9 100644 --- a/kotlin-native/performance/shared/src/main/kotlin-native/common/org/jetbrains/benchmarksLauncher/Utils.kt +++ b/kotlin-native/performance/shared/src/main/kotlin-native/common/org/jetbrains/benchmarksLauncher/Utils.kt
@@ -16,7 +16,7 @@ package org.jetbrains.benchmarksLauncher -import kotlin.native.internal.GC +import kotlin.native.runtime.GC import platform.posix.* import kotlinx.cinterop.* @@ -39,6 +39,7 @@ return kotlin.system.measureNanoTime(block) } +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) actual fun cleanup() { GC.collect() }
diff --git a/kotlin-native/performance/swiftinterop/src/main/kotlin/org/jetbrains/GC.kt b/kotlin-native/performance/swiftinterop/src/main/kotlin/org/jetbrains/GC.kt index 053d196..8b55772 100644 --- a/kotlin-native/performance/swiftinterop/src/main/kotlin/org/jetbrains/GC.kt +++ b/kotlin-native/performance/swiftinterop/src/main/kotlin/org/jetbrains/GC.kt
@@ -2,10 +2,11 @@ * Copyright 2010-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ +@file:OptIn(kotlin.native.runtime.NativeRuntimeApi::class) package org.jetbrains.gc -import kotlin.native.internal.GC +import kotlin.native.runtime.GC fun collect() = GC.collect() fun schedule() = GC.schedule()
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Atomics.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Atomics.kt index 3f598f3..a64e98e 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Atomics.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Atomics.kt
@@ -187,7 +187,7 @@ * * Legacy MM: An atomic reference to a frozen Kotlin object. Can be used in concurrent scenarious * but frequently shall be of nullable type and be zeroed out once no longer needed. - * Otherwise memory leak could happen. To detect such leaks [kotlin.native.internal.GC.detectCycles] + * Otherwise memory leak could happen. To detect such leaks [kotlin.native.runtime.GC.detectCycles] * in debug mode could be helpful. */ @FrozenLegacyMM @@ -284,7 +284,7 @@ * * An atomic reference to a Kotlin object. Can be used in concurrent scenarious, but must be frozen first, * otherwise behaves as regular box for the value. If frozen, shall be zeroed out once no longer needed. - * Otherwise memory leak could happen. To detect such leaks [kotlin.native.internal.GC.detectCycles] + * Otherwise memory leak could happen. To detect such leaks [kotlin.native.runtime.GC.detectCycles] * in debug mode could be helpful. */ @NoReorderFields
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/ObjectTransfer.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/ObjectTransfer.kt index 7172d5d..2aae88c 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/ObjectTransfer.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/ObjectTransfer.kt
@@ -33,7 +33,7 @@ * Note, that for some cases cycle collection need to be done to ensure that dead cycles do not affect * reachability of passed object graph. * - * @see [kotlin.native.internal.GC.collect]. + * @see [kotlin.native.runtime.GC.collect]. */ // Not @FreezingIsDeprecated: every `Worker.execute` uses this. public enum class TransferMode(val value: Int) {
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Worker.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Worker.kt index ffc0207..4002b74 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Worker.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Worker.kt
@@ -100,7 +100,7 @@ * and result of such a execution is being disconnected from worker's object graph. Whoever will consume * the future, can use result of worker's computations. * Note, that some technically disjoint subgraphs may lead to `kotlin.IllegalStateException` - * so `kotlin.native.internal.GC.collect()` could be called in the end of `producer` and `job` + * so `kotlin.native.runtime.GC.collect()` could be called in the end of `producer` and `job` * if garbage cyclic structures or other uncollected objects refer to the value being transferred. * * @return the future with the computation result of [job].
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Cleaner.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Cleaner.kt index df13c04..df46aef 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Cleaner.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Cleaner.kt
@@ -7,6 +7,7 @@ import kotlin.experimental.ExperimentalNativeApi import kotlin.native.concurrent.* +import kotlin.native.runtime.GC import kotlinx.cinterop.NativePtr @Deprecated("Use kotlin.native.ref.Cleaner instead.", ReplaceWith("kotlin.native.ref.Cleaner")) @@ -83,6 +84,7 @@ * Perform GC on a worker that executes Cleaner blocks. */ @InternalForKotlinNative +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) fun performGCOnCleanerWorker() = getCleanerWorker().execute(TransferMode.SAFE, {}) { GC.collect()
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/GC.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/GC.kt index 53e6d9b..bee4c6b 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/GC.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/GC.kt
@@ -5,9 +5,7 @@ package kotlin.native.internal -import kotlin.native.internal.gc.GCInfo import kotlin.time.* -import kotlin.time.Duration.Companion.microseconds /** * __Note__: this API is unstable and may change in any release. @@ -34,6 +32,9 @@ * its lifetime, and resume it later on, or just completely turn it off, if GC pauses * are less desirable than cyclical garbage leaks. */ +@Deprecated("Use kotlin.native.runtime.GC instead.", ReplaceWith("GC", "kotlin.native.runtime.GC")) +@DeprecatedSinceKotlin(warningSince = "1.9") +@OptIn(kotlin.native.runtime.NativeRuntimeApi::class) object GC { /** * Trigger new collection and wait for its completion. @@ -108,12 +109,7 @@ * * @throws [IllegalArgumentException] when value is not positive. */ - var threshold: Int - get() = getThreshold() - set(value) { - require(value > 0) { "threshold must be positive: $value" } - setThreshold(value) - } + var threshold: Int by kotlin.native.runtime.GC::threshold /** * Deprecated and unused. @@ -125,13 +121,9 @@ * * @throws [IllegalArgumentException] when value is not positive. */ + @Suppress("DEPRECATION") @Deprecated("No-op in modern GC implementation") - var collectCyclesThreshold: Long - get() = getCollectCyclesThreshold() - set(value) { - require(value > 0) { "collectCyclesThreshold must be positive: $value" } - setCollectCyclesThreshold(value) - } + var collectCyclesThreshold: Long by kotlin.native.runtime.GC::collectCyclesThreshold /** * How many bytes a thread can allocate before informing the GC scheduler. @@ -145,12 +137,7 @@ * * @throws [IllegalArgumentException] when value is not positive. */ - var thresholdAllocations: Long - get() = getThresholdAllocations() - set(value) { - require(value > 0) { "thresholdAllocations must be positive: $value" } - setThresholdAllocations(value) - } + var thresholdAllocations: Long by kotlin.native.runtime.GC::thresholdAllocations /** * If true update targetHeapBytes after each collection. @@ -159,9 +146,7 @@ * * Default: true */ - var autotune: Boolean - get() = getTuneThreshold() - set(value) = setTuneThreshold(value) + var autotune: Boolean by kotlin.native.runtime.GC::autotune /** @@ -169,10 +154,9 @@ * * Legacy MM: If cyclic collector for atomic references to be deployed. */ + @Suppress("DEPRECATION") @Deprecated("No-op in modern GC implementation") - var cyclicCollectorEnabled: Boolean - get() = getCyclicCollectorEnabled() - set(value) = setCyclicCollectorEnabled(value) + var cyclicCollectorEnabled: Boolean by kotlin.native.runtime.GC::cyclicCollectorEnabled /** * When Kotlin code is not allocating enough to trigger GC, the GC scheduler uses timer to drive collection. @@ -186,12 +170,7 @@ * * @throws [IllegalArgumentException] when value is negative. */ - var regularGCInterval: Duration - get() = getRegularGCIntervalMicroseconds().microseconds - set(value) { - require(!value.isNegative()) { "regularGCInterval must not be negative: $value" } - setRegularGCIntervalMicroseconds(value.inWholeMicroseconds) - } + var regularGCInterval: Duration by kotlin.native.runtime.GC::regularGCInterval /** * Total amount of heap available for Kotlin objects. When Kotlin objects overflow this heap, @@ -208,12 +187,7 @@ * * @throws [IllegalArgumentException] when value is negative. */ - var targetHeapBytes: Long - get() = getTargetHeapBytes() - set(value) { - require(value >= 0) { "targetHeapBytes must not be negative: $value" } - setTargetHeapBytes(value) - } + var targetHeapBytes: Long by kotlin.native.runtime.GC::targetHeapBytes /** * What fraction of the Kotlin heap should be populated. @@ -225,12 +199,7 @@ * * @throws [IllegalArgumentException] when value is outside (0, 1] interval. */ - var targetHeapUtilization: Double - get() = getTargetHeapUtilization() - set(value) { - require(value > 0 && value <= 1) { "targetHeapUtilization must be in (0, 1] interval: $value" } - setTargetHeapUtilization(value) - } + var targetHeapUtilization: Double by kotlin.native.runtime.GC::targetHeapUtilization /** * The minimum value for [targetHeapBytes] @@ -242,12 +211,7 @@ * * @throws [IllegalArgumentException] when value is negative. */ - var minHeapBytes: Long - get() = getMinHeapBytes() - set(value) { - require(value >= 0) { "minHeapBytes must not be negative: $value" } - setMinHeapBytes(value) - } + var minHeapBytes: Long by kotlin.native.runtime.GC::minHeapBytes /** * The maximum value for [targetHeapBytes]. @@ -259,12 +223,7 @@ * * @throws [IllegalArgumentException] when value is negative. */ - var maxHeapBytes: Long - get() = getMaxHeapBytes() - set(value) { - require(value >= 0) { "maxHeapBytes must not be negative: $value" } - setMaxHeapBytes(value) - } + var maxHeapBytes: Long by kotlin.native.runtime.GC::maxHeapBytes /** * Deprecated and unused. Always returns null. @@ -286,75 +245,7 @@ * Legacy MM: Always returns null */ @ExperimentalStdlibApi - val lastGCInfo: GCInfo? - get() = GCInfo.lastGCInfo - - /** - * Deprecated and unused. Always returns null. - * - * Legacy MM: Find a reference cycle including from the given object, `null` if no cycles detected. - */ - @GCUnsafeCall("Kotlin_native_internal_GC_findCycle") - @Deprecated("No-op in modern GC implementation") - external fun findCycle(root: Any): Array<Any>? - - @GCUnsafeCall("Kotlin_native_internal_GC_getThreshold") - private external fun getThreshold(): Int - - @GCUnsafeCall("Kotlin_native_internal_GC_setThreshold") - private external fun setThreshold(value: Int) - - @GCUnsafeCall("Kotlin_native_internal_GC_getCollectCyclesThreshold") - private external fun getCollectCyclesThreshold(): Long - - @GCUnsafeCall("Kotlin_native_internal_GC_setCollectCyclesThreshold") - private external fun setCollectCyclesThreshold(value: Long) - - @GCUnsafeCall("Kotlin_native_internal_GC_getThresholdAllocations") - private external fun getThresholdAllocations(): Long - - @GCUnsafeCall("Kotlin_native_internal_GC_setThresholdAllocations") - private external fun setThresholdAllocations(value: Long) - - @GCUnsafeCall("Kotlin_native_internal_GC_getTuneThreshold") - private external fun getTuneThreshold(): Boolean - - @GCUnsafeCall("Kotlin_native_internal_GC_setTuneThreshold") - private external fun setTuneThreshold(value: Boolean) - - @GCUnsafeCall("Kotlin_native_internal_GC_getCyclicCollector") - private external fun getCyclicCollectorEnabled(): Boolean - - @GCUnsafeCall("Kotlin_native_internal_GC_setCyclicCollector") - private external fun setCyclicCollectorEnabled(value: Boolean) - - @GCUnsafeCall("Kotlin_native_internal_GC_getRegularGCIntervalMicroseconds") - private external fun getRegularGCIntervalMicroseconds(): Long - - @GCUnsafeCall("Kotlin_native_internal_GC_setRegularGCIntervalMicroseconds") - private external fun setRegularGCIntervalMicroseconds(value: Long) - - @GCUnsafeCall("Kotlin_native_internal_GC_getTargetHeapBytes") - private external fun getTargetHeapBytes(): Long - - @GCUnsafeCall("Kotlin_native_internal_GC_setTargetHeapBytes") - private external fun setTargetHeapBytes(value: Long) - - @GCUnsafeCall("Kotlin_native_internal_GC_getTargetHeapUtilization") - private external fun getTargetHeapUtilization(): Double - - @GCUnsafeCall("Kotlin_native_internal_GC_setTargetHeapUtilization") - private external fun setTargetHeapUtilization(value: Double) - - @GCUnsafeCall("Kotlin_native_internal_GC_getMinHeapBytes") - private external fun getMinHeapBytes(): Long - - @GCUnsafeCall("Kotlin_native_internal_GC_setMinHeapBytes") - private external fun setMinHeapBytes(value: Long) - - @GCUnsafeCall("Kotlin_native_internal_GC_getMaxHeapBytes") - private external fun getMaxHeapBytes(): Long - - @GCUnsafeCall("Kotlin_native_internal_GC_setMaxHeapBytes") - private external fun setMaxHeapBytes(value: Long) + @Suppress("DEPRECATION") + val lastGCInfo: kotlin.native.internal.gc.GCInfo? + get() = kotlin.native.internal.gc.GCInfo.lastGCInfo }
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/runtime/GC.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/runtime/GC.kt new file mode 100644 index 0000000..a40f3bd --- /dev/null +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/runtime/GC.kt
@@ -0,0 +1,362 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlin.native.runtime + +import kotlin.time.* +import kotlin.time.Duration.Companion.microseconds +import kotlin.native.internal.GCUnsafeCall + +/** + * __Note__: this API is unstable and may change in any release. + * + * Kotlin/Native uses tracing garbage collector (GC) that is executed periodically to collect objects + * that are not reachable from the "roots", like local and global variables. + * See [documentation](https://kotlinlang.org/docs/native-memory-manager.html) to learn more about + * Kotlin/Native memory management. + * + * This object provides a set of functions and properties that allows to tune garbage collector. + * + * __Legacy memory manager__ + * + * Kotlin/Native relies upon reference counting for object management, however it could + * not collect cyclical garbage, so we perform periodic garbage collection. + * This may slow down application, so this interface provides control over how + * garbage collector activates and runs. + * Garbage collector can be in one of the following states: + * - running + * - suspended (so cycle candidates are collected, but GC is not performed until resume) + * - stopped (all cyclical garbage is hopelessly lost) + * Immediately after startup GC is in running state. + * Depending on application needs it may select to suspend GC for certain phases of + * its lifetime, and resume it later on, or just completely turn it off, if GC pauses + * are less desirable than cyclical garbage leaks. + */ +@NativeRuntimeApi +@SinceKotlin("1.9") +public object GC { + /** + * Trigger new collection and wait for its completion. + * + * Legacy MM: force garbage collection immediately, unless collector is stopped + * with [stop] operation. Even if GC is suspended, [collect] still triggers collection. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_collect") + external fun collect() + + /** + * Trigger new collection without waiting for its completion. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_schedule") + external fun schedule() + + /** + * Deprecated and unused. + * + * Legacy MM: Request global cyclic collector, operation is async and just triggers the collection. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_collectCyclic") + @Deprecated("No-op in modern GC implementation") + external fun collectCyclic() + + /** + * Deprecated and unused. + * + * Legacy MM: Suspend garbage collection. Release candidates are still collected, but + * GC algorithm is not executed. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_suspend") + external fun suspend() + + /** + * Deprecated and unused. + * + * Legacy MM: Resume garbage collection. Can potentially lead to GC immediately. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_resume") + @Deprecated("No-op in modern GC implementation") + external fun resume() + + /** + * Deprecated and unused. + * + * Legacy MM: Stop garbage collection. Cyclical garbage is no longer collected. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_stop") + @Deprecated("No-op in modern GC implementation") + external fun stop() + + /** + * Deprecated and unused. + * + * Legacy MM: Start garbage collection. Cyclical garbage produced while GC was stopped + * cannot be reclaimed, but all new garbage is collected. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_start") + @Deprecated("No-op in modern GC implementation") + external fun start() + + /** + * GC threshold, controlling how frequenly GC is activated, and how much time GC + * takes. Bigger values lead to longer GC pauses, but less GCs. + * Usually unused. For the on-safepoints GC scheduler counts + * how many safepoints must the code pass before informing the GC scheduler. + * + * Default: (old MM) 8 * 1024 + * + * Default: (new MM) 100000 + * + * @throws [IllegalArgumentException] when value is not positive. + */ + var threshold: Int + get() = getThreshold() + set(value) { + require(value > 0) { "threshold must be positive: $value" } + setThreshold(value) + } + + /** + * Deprecated and unused. + * + * Legacy MM: GC allocation threshold, controlling how frequenly GC collect cycles, and how much time + * this process takes. Bigger values lead to longer GC pauses, but less GCs. + * + * Default: 8 * 1024 + * + * @throws [IllegalArgumentException] when value is not positive. + */ + @Deprecated("No-op in modern GC implementation") + var collectCyclesThreshold: Long + get() = getCollectCyclesThreshold() + set(value) { + require(value > 0) { "collectCyclesThreshold must be positive: $value" } + setCollectCyclesThreshold(value) + } + + /** + * How many bytes a thread can allocate before informing the GC scheduler. + * + * Default: 10 * 1024 + * + * Legacy MM: GC allocation threshold, controlling how many bytes allocated since last + * collection will trigger new GC. + * + * Default: (legacy MM) 8 * 1024 * 1024 + * + * @throws [IllegalArgumentException] when value is not positive. + */ + var thresholdAllocations: Long + get() = getThresholdAllocations() + set(value) { + require(value > 0) { "thresholdAllocations must be positive: $value" } + setThresholdAllocations(value) + } + + /** + * If true update targetHeapBytes after each collection. + * + * Legacy MM: If GC shall auto-tune thresholds, depending on how much time is spent in collection. + * + * Default: true + */ + var autotune: Boolean + get() = getTuneThreshold() + set(value) = setTuneThreshold(value) + + + /** + * Deprecated and unused. + * + * Legacy MM: If cyclic collector for atomic references to be deployed. + */ + @Deprecated("No-op in modern GC implementation") + var cyclicCollectorEnabled: Boolean + get() = getCyclicCollectorEnabled() + set(value) = setCyclicCollectorEnabled(value) + + /** + * When Kotlin code is not allocating enough to trigger GC, the GC scheduler uses timer to drive collection. + * Timer-triggered collection will happen roughly in [regularGCInterval] .. 2 * [regularGCInterval] since + * any previous collection. + * Unused with on-safepoints GC scheduler. + * + * Default: 10 seconds + * + * Unused in legacy MM. + * + * @throws [IllegalArgumentException] when value is negative. + */ + var regularGCInterval: Duration + get() = getRegularGCIntervalMicroseconds().microseconds + set(value) { + require(!value.isNegative()) { "regularGCInterval must not be negative: $value" } + setRegularGCIntervalMicroseconds(value.inWholeMicroseconds) + } + + /** + * Total amount of heap available for Kotlin objects. When Kotlin objects overflow this heap, + * the garbage collection is requested. Automatically adjusts when [autotune] is true: + * after each collection the [targetHeapBytes] is set to heapBytes / [targetHeapUtilization] and + * capped between [minHeapBytes] and [maxHeapBytes], where heapBytes is heap usage after the garbage + * is collected. + * Note, that if after a collection heapBytes > [targetHeapBytes] (which may happen if [autotune] is false, + * or [maxHeapBytes] is set too low), the next collection will be triggered almost immediately. + * + * Default: 1 MiB + * + * Unused in legacy MM. + * + * @throws [IllegalArgumentException] when value is negative. + */ + var targetHeapBytes: Long + get() = getTargetHeapBytes() + set(value) { + require(value >= 0) { "targetHeapBytes must not be negative: $value" } + setTargetHeapBytes(value) + } + + /** + * What fraction of the Kotlin heap should be populated. + * Only used if [autotune] is true. See [targetHeapBytes] for more details. + * + * Default: 0.5 + * + * Unused in legacy MM. + * + * @throws [IllegalArgumentException] when value is outside (0, 1] interval. + */ + var targetHeapUtilization: Double + get() = getTargetHeapUtilization() + set(value) { + require(value > 0 && value <= 1) { "targetHeapUtilization must be in (0, 1] interval: $value" } + setTargetHeapUtilization(value) + } + + /** + * The minimum value for [targetHeapBytes] + * Only used if [autotune] is true. See [targetHeapBytes] for more details. + * + * Default: 1 MiB + * + * Unused in legacy MM. + * + * @throws [IllegalArgumentException] when value is negative. + */ + var minHeapBytes: Long + get() = getMinHeapBytes() + set(value) { + require(value >= 0) { "minHeapBytes must not be negative: $value" } + setMinHeapBytes(value) + } + + /** + * The maximum value for [targetHeapBytes]. + * Only used if [autotune] is true. See [targetHeapBytes] for more details. + * + * Default: [Long.MAX_VALUE] + * + * Unused in legacy MM. + * + * @throws [IllegalArgumentException] when value is negative. + */ + var maxHeapBytes: Long + get() = getMaxHeapBytes() + set(value) { + require(value >= 0) { "maxHeapBytes must not be negative: $value" } + setMaxHeapBytes(value) + } + + /** + * Deprecated and unused. Always returns null. + * + * Legacy MM: Detect cyclic references going via atomic references and return list of cycle-inducing objects + * or `null` if the leak detector is not available. Use [Platform.isMemoryLeakCheckerActive] to check + * leak detector availability. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_detectCycles") + @Deprecated("No-op in modern GC implementation") + external fun detectCycles(): Array<Any>? + + /** + * Returns statistics of the last finished garbage collection run. + * This information is supposed to be used for testing and debugging purposes only + * + * Can return null, if there was no garbage collection runs yet. + * + * Legacy MM: Always returns null + */ + @ExperimentalStdlibApi + val lastGCInfo: GCInfo? + get() = GCInfo.lastGCInfo + + /** + * Deprecated and unused. Always returns null. + * + * Legacy MM: Find a reference cycle including from the given object, `null` if no cycles detected. + */ + @GCUnsafeCall("Kotlin_native_internal_GC_findCycle") + @Deprecated("No-op in modern GC implementation") + external fun findCycle(root: Any): Array<Any>? + + @GCUnsafeCall("Kotlin_native_internal_GC_getThreshold") + private external fun getThreshold(): Int + + @GCUnsafeCall("Kotlin_native_internal_GC_setThreshold") + private external fun setThreshold(value: Int) + + @GCUnsafeCall("Kotlin_native_internal_GC_getCollectCyclesThreshold") + private external fun getCollectCyclesThreshold(): Long + + @GCUnsafeCall("Kotlin_native_internal_GC_setCollectCyclesThreshold") + private external fun setCollectCyclesThreshold(value: Long) + + @GCUnsafeCall("Kotlin_native_internal_GC_getThresholdAllocations") + private external fun getThresholdAllocations(): Long + + @GCUnsafeCall("Kotlin_native_internal_GC_setThresholdAllocations") + private external fun setThresholdAllocations(value: Long) + + @GCUnsafeCall("Kotlin_native_internal_GC_getTuneThreshold") + private external fun getTuneThreshold(): Boolean + + @GCUnsafeCall("Kotlin_native_internal_GC_setTuneThreshold") + private external fun setTuneThreshold(value: Boolean) + + @GCUnsafeCall("Kotlin_native_internal_GC_getCyclicCollector") + private external fun getCyclicCollectorEnabled(): Boolean + + @GCUnsafeCall("Kotlin_native_internal_GC_setCyclicCollector") + private external fun setCyclicCollectorEnabled(value: Boolean) + + @GCUnsafeCall("Kotlin_native_internal_GC_getRegularGCIntervalMicroseconds") + private external fun getRegularGCIntervalMicroseconds(): Long + + @GCUnsafeCall("Kotlin_native_internal_GC_setRegularGCIntervalMicroseconds") + private external fun setRegularGCIntervalMicroseconds(value: Long) + + @GCUnsafeCall("Kotlin_native_internal_GC_getTargetHeapBytes") + private external fun getTargetHeapBytes(): Long + + @GCUnsafeCall("Kotlin_native_internal_GC_setTargetHeapBytes") + private external fun setTargetHeapBytes(value: Long) + + @GCUnsafeCall("Kotlin_native_internal_GC_getTargetHeapUtilization") + private external fun getTargetHeapUtilization(): Double + + @GCUnsafeCall("Kotlin_native_internal_GC_setTargetHeapUtilization") + private external fun setTargetHeapUtilization(value: Double) + + @GCUnsafeCall("Kotlin_native_internal_GC_getMinHeapBytes") + private external fun getMinHeapBytes(): Long + + @GCUnsafeCall("Kotlin_native_internal_GC_setMinHeapBytes") + private external fun setMinHeapBytes(value: Long) + + @GCUnsafeCall("Kotlin_native_internal_GC_getMaxHeapBytes") + private external fun getMaxHeapBytes(): Long + + @GCUnsafeCall("Kotlin_native_internal_GC_setMaxHeapBytes") + private external fun setMaxHeapBytes(value: Long) +}