From 0dc855619f4701f2e27281e33c52a4ffe91505d6 Mon Sep 17 00:00:00 2001 From: Alexander Shabalin Date: Fri, 24 Apr 2020 15:48:38 +0300 Subject: [PATCH] Add WorkerBoundReference.worker (#4135) --- .../concurrent/worker_bound_reference0.kt | 50 +++++++++++++++++++ .../native/concurrent/WorkerBoundReference.kt | 5 ++ 2 files changed, 55 insertions(+) diff --git a/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt b/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt index 25be9c232bf..f090c776f08 100644 --- a/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt +++ b/backend.native/tests/runtime/concurrent/worker_bound_reference0.kt @@ -140,6 +140,23 @@ fun testGlobalModification() { worker.requestTermination().result } +val global7: WorkerBoundReference = WorkerBoundReference(A(3)) + +@Test +fun testGlobalGetWorker() { + val ownerId = Worker.current.id + assertEquals(ownerId, global7.worker.id) + + val worker = Worker.start() + val future = worker.execute(TransferMode.SAFE, { ownerId }) { ownerId -> + assertEquals(ownerId, global7.worker.id) + Unit + } + + future.result + worker.requestTermination().result +} + @Test fun testLocal() { val local = WorkerBoundReference(A(3)) @@ -276,6 +293,39 @@ fun testLocalModification() { worker.requestTermination().result } +@Test +fun testLocalGetWorker() { + val local = WorkerBoundReference(A(3)) + + val ownerId = Worker.current.id + assertEquals(ownerId, local.worker.id) + + val worker = Worker.start() + val future = worker.execute(TransferMode.SAFE, { Pair(local, ownerId) }) { (local, ownerId) -> + assertEquals(ownerId, local.worker.id) + Unit + } + + future.result + worker.requestTermination().result +} + +@Test +fun testLocalForeignGetWorker() { + val worker = Worker.start() + val ownerId = worker.id + val future = worker.execute(TransferMode.SAFE, { ownerId }) { ownerId -> + val local = WorkerBoundReference(A(3)) + assertEquals(ownerId, local.worker.id) + local + } + + val value = future.result + assertEquals(ownerId, value.worker.id) + + worker.requestTermination().result +} + fun getOwnerAndWeaks(initial: Int): Triple?>, WeakReference>, WeakReference> { val ref = WorkerBoundReference(A(initial)) val refOwner: AtomicReference?> = AtomicReference(ref) diff --git a/runtime/src/main/kotlin/kotlin/native/concurrent/WorkerBoundReference.kt b/runtime/src/main/kotlin/kotlin/native/concurrent/WorkerBoundReference.kt index c3a953dc0f5..f47378a4d74 100644 --- a/runtime/src/main/kotlin/kotlin/native/concurrent/WorkerBoundReference.kt +++ b/runtime/src/main/kotlin/kotlin/native/concurrent/WorkerBoundReference.kt @@ -49,4 +49,9 @@ public class WorkerBoundReference(value: T) { */ val valueOrNull: T? get() = @Suppress("UNCHECKED_CAST") (derefWorkerBoundReference(ptr) as T?) + + /** + * Worker that [value] is bound to. + */ + val worker: Worker = Worker.current }