Add WorkerBoundReference.worker (#4135)

This commit is contained in:
Alexander Shabalin
2020-04-24 15:48:38 +03:00
committed by GitHub
parent 88fc861dd1
commit 0dc855619f
2 changed files with 55 additions and 0 deletions
@@ -140,6 +140,23 @@ fun testGlobalModification() {
worker.requestTermination().result
}
val global7: WorkerBoundReference<A> = 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<AtomicReference<WorkerBoundReference<A>?>, WeakReference<WorkerBoundReference<A>>, WeakReference<A>> {
val ref = WorkerBoundReference(A(initial))
val refOwner: AtomicReference<WorkerBoundReference<A>?> = AtomicReference(ref)
@@ -49,4 +49,9 @@ public class WorkerBoundReference<out T : Any>(value: T) {
*/
val valueOrNull: T?
get() = @Suppress("UNCHECKED_CAST") (derefWorkerBoundReference(ptr) as T?)
/**
* Worker that [value] is bound to.
*/
val worker: Worker = Worker.current
}