Skip to content

Commit

Permalink
SI-6581 fixed by inlining Actor.self.
Browse files Browse the repository at this point in the history
This avoids the necessary type cast that was preventing leakage of internal migration classes.

Review by @phaller
  • Loading branch information
Vojin Jovanovic committed Oct 30, 2012
1 parent 2c55424 commit f627d8a
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/actors/scala/actors/remote/NetKernel.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
10 changes: 5 additions & 5 deletions src/actors/scala/actors/remote/RemoteActor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 <code>null</code> (default), the default class loader
* of <code>java.io.ObjectInputStream</code> is used for deserializing
Expand All @@ -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 {
Expand All @@ -86,18 +86,18 @@ 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
}
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)
Expand Down
1 change: 1 addition & 0 deletions test/files/jvm/actmig-remote-actor-self.check
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
registered
34 changes: 34 additions & 0 deletions test/files/jvm/actmig-remote-actor-self.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
* 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._
import scala.actors.migration._
import scala.actors.remote._
import scala.actors.remote.RemoteActor._
import scala.concurrent._
import scala.concurrent.duration._

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(42013)
println("registered")
finished success true
context.stop(self)
}

def receive = {
case x: Int =>
}
})

Await.result(finished.future, Duration.Inf).toString
}

}

0 comments on commit f627d8a

Please sign in to comment.