From 626bd15b1335c03a85d7c3bd40cc324552108d8a Mon Sep 17 00:00:00 2001 From: Vojin Jovanovic Date: Fri, 26 Oct 2012 17:26:14 +0200 Subject: [PATCH] Fix for Actor.self in Scala actors. --- .../scala/actors/remote/NetKernel.scala | 2 +- .../scala/actors/remote/RemoteActor.scala | 10 +++--- test/files/jvm/actmig-remote-actor-self.check | 1 + test/files/jvm/actmig-remote-actor-self.scala | 36 +++++++++++++++++++ 4 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 test/files/jvm/actmig-remote-actor-self.check create mode 100644 test/files/jvm/actmig-remote-actor-self.scala diff --git a/src/actors/scala/actors/remote/NetKernel.scala b/src/actors/scala/actors/remote/NetKernel.scala index c6b2d8b8cde1..8338f9a6a69c 100644 --- a/src/actors/scala/actors/remote/NetKernel.scala +++ b/src/actors/scala/actors/remote/NetKernel.scala @@ -60,7 +60,7 @@ private[remote] class NetKernel(service: Service) { send(node, name, msg, 'nosession) def send(node: Node, name: Symbol, msg: AnyRef, session: Symbol) { - val senderLoc = Locator(service.node, getOrCreateName(Actor.self)) + val senderLoc = Locator(service.node, getOrCreateName(Actor.self(Scheduler))) val receiverLoc = Locator(node, name) namedSend(senderLoc, receiverLoc, msg, session) } diff --git a/src/actors/scala/actors/remote/RemoteActor.scala b/src/actors/scala/actors/remote/RemoteActor.scala index 23cbae85326c..571cb67e951d 100644 --- a/src/actors/scala/actors/remote/RemoteActor.scala +++ b/src/actors/scala/actors/remote/RemoteActor.scala @@ -40,7 +40,7 @@ package remote */ object RemoteActor { - private val kernels = new scala.collection.mutable.HashMap[Actor, NetKernel] + private val kernels = new scala.collection.mutable.HashMap[InternalActor, NetKernel] /* If set to null (default), the default class loader * of java.io.ObjectInputStream is used for deserializing @@ -62,7 +62,7 @@ object RemoteActor { private def createNetKernelOnPort(port: Int): NetKernel = { val serv = TcpService(port, cl) val kern = serv.kernel - val s = Actor.self + val s = Actor.self(Scheduler) kernels += Pair(s, kern) s.onTerminate { @@ -86,10 +86,10 @@ object RemoteActor { * node. */ def register(name: Symbol, a: Actor): Unit = synchronized { - val kernel = kernels.get(Actor.self) match { + val kernel = kernels.get(Actor.self(Scheduler)) match { case None => val serv = TcpService(TcpService.generatePort, cl) - kernels += Pair(Actor.self, serv.kernel) + kernels += Pair(Actor.self(Scheduler), serv.kernel) serv.kernel case Some(k) => k @@ -97,7 +97,7 @@ object RemoteActor { kernel.register(name, a) } - private def selfKernel = kernels.get(Actor.self) match { + private def selfKernel = kernels.get(Actor.self(Scheduler)) match { case None => // establish remotely accessible // return path (sender) diff --git a/test/files/jvm/actmig-remote-actor-self.check b/test/files/jvm/actmig-remote-actor-self.check new file mode 100644 index 000000000000..79d23cb3377a --- /dev/null +++ b/test/files/jvm/actmig-remote-actor-self.check @@ -0,0 +1 @@ +registered diff --git a/test/files/jvm/actmig-remote-actor-self.scala b/test/files/jvm/actmig-remote-actor-self.scala new file mode 100644 index 000000000000..143c13cae974 --- /dev/null +++ b/test/files/jvm/actmig-remote-actor-self.scala @@ -0,0 +1,36 @@ +/** + * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change + * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov. + */ +import scala.actors.Actor._ +import scala.actors._ +import scala.actors.migration._ +import scala.actors.remote._ +import scala.actors.remote.RemoteActor._ + +import java.util.concurrent.{ TimeUnit, CountDownLatch } +import scala.collection.mutable.ArrayBuffer +import scala.concurrent.duration._ +import scala.concurrent.{ Promise, Await } + +object Test { + val finished = Promise[Boolean] + + def main(args: Array[String]): Unit = { + // Can fail with class cast exception in alive + val myAkkaActor = ActorDSL.actor(new StashingActor { + override def preStart() = { + alive(2013) + println("registered") + finished success true + context.stop(self) + } + + def receive = { + case x: Int => + } + }) + + } + +}