// OUTPUT_DATA_FILE: worker10.out // DISABLE_NATIVE: gcType=NOOP // FREE_COMPILER_ARGS: -opt-in=kotlin.experimental.ExperimentalNativeApi,kotlin.native.runtime.NativeRuntimeApi,kotlinx.cinterop.ExperimentalForeignApi import kotlin.test.* import kotlin.concurrent.AtomicReference import kotlin.concurrent.AtomicInt import kotlin.concurrent.* import kotlin.native.concurrent.* import kotlin.native.ref.WeakReference import kotlinx.cinterop.StableRef class Data(val x: Int) val topInt = 1 val topString = "string" var topStringVar = "string" val topSharedStringWithGetter: String get() = "top" val topData = Data(42) val topSharedData = Data(43) @Test fun runTest1() { val worker = Worker.start() assertEquals(1, topInt) assertEquals("string", topString) assertEquals(42, topData.x) assertEquals(43, topSharedData.x) assertEquals("top", topSharedStringWithGetter) worker.execute(TransferMode.SAFE, { -> }, { it -> topInt == 1 }).consume { result -> assertEquals(true, result) } worker.execute(TransferMode.SAFE, { -> }, { it -> topString == "string" }).consume { result -> assertEquals(true, result) } worker.execute(TransferMode.SAFE, { -> }, { it -> topStringVar == "string" }).consume { result -> assertTrue(result) } worker.execute(TransferMode.SAFE, { -> }, { it -> topSharedStringWithGetter == "top" }).consume { result -> assertTrue(result) } worker.execute(TransferMode.SAFE, { -> }, { it -> topData.x == 42 }).consume { result -> assertTrue(result) } worker.execute(TransferMode.SAFE, { -> }, { it -> try { topSharedData.x == 43 } catch (e: Throwable) { false } }).consume { result -> assertTrue(result) } worker.requestTermination().result println("OK") } val atomicRef = AtomicReference(Any()) val stableRef = StableRef.create(Any()) val semaphore = AtomicInt(0) @Test fun runTest2() { semaphore.value = 0 val worker = Worker.start() val future = worker.execute(TransferMode.SAFE, { null }) { val value = atomicRef.value semaphore.incrementAndGet() while (semaphore.value != 2) {} println(value.toString() != "") } while (semaphore.value != 1) {} atomicRef.value = null kotlin.native.runtime.GC.collect() semaphore.incrementAndGet() future.result worker.requestTermination().result } @Test fun runTest3() { semaphore.value = 0 val worker = Worker.start() val future = worker.execute(TransferMode.SAFE, { null }) { val value = stableRef.get() semaphore.incrementAndGet() while (semaphore.value != 2) {} println(value.toString() != "") } while (semaphore.value != 1) {} stableRef.dispose() kotlin.native.runtime.GC.collect() semaphore.incrementAndGet() future.result worker.requestTermination().result } fun ensureWeakIs(weak: WeakReference, expected: T?) { assertEquals(expected, weak.get()) } val stableHolder1 = StableRef.create(("hello" to "world")) @Test fun runTest4() { val worker = Worker.start() semaphore.value = 0 val future = worker.execute(TransferMode.SAFE, { WeakReference(stableHolder1.get()) }) { ensureWeakIs(it, "hello" to "world") semaphore.incrementAndGet() while (semaphore.value != 2) {} kotlin.native.runtime.GC.collect() ensureWeakIs(it, null) } while (semaphore.value != 1) {} stableHolder1.dispose() kotlin.native.runtime.GC.collect() semaphore.incrementAndGet() future.result worker.requestTermination().result } val stableHolder2 = StableRef.create(("hello" to "world")) @Test fun runTest5() { val worker = Worker.start() semaphore.value = 0 val future = worker.execute(TransferMode.SAFE, { WeakReference(stableHolder2.get()) }) { val value = it.get() semaphore.incrementAndGet() while (semaphore.value != 2) {} kotlin.native.runtime.GC.collect() assertEquals("hello" to "world", value) } while (semaphore.value != 1) {} stableHolder2.dispose() kotlin.native.runtime.GC.collect() semaphore.incrementAndGet() future.result worker.requestTermination().result } val atomicRef2 = AtomicReference(Any()) @Test fun runTest6() { semaphore.value = 0 val worker = Worker.start() val future = worker.execute(TransferMode.SAFE, { null }) { val value = atomicRef2.compareAndExchange(null, null) semaphore.incrementAndGet() while (semaphore.value != 2) {} assertEquals(true, value.toString() != "") } while (semaphore.value != 1) {} atomicRef2.value = null kotlin.native.runtime.GC.collect() semaphore.incrementAndGet() future.result worker.requestTermination().result }