From 13eb1b6c8b5e516cb0e3ebd69cdabd6cf8dcfe36 Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 5 Dec 2011 16:18:56 +0100 Subject: [PATCH] replace @volatile for childrenRefs with mailbox status read for memory consistency --- akka-actor/src/main/scala/akka/actor/ActorCell.scala | 2 -- akka-actor/src/main/scala/akka/actor/ActorRef.scala | 9 ++++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 01500a0301..2eb1ccd777 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -99,8 +99,6 @@ private[akka] class ActorCell( var receiveTimeoutData: (Long, Cancellable) = if (_receiveTimeout.isDefined) (_receiveTimeout.get, emptyCancellable) else emptyReceiveTimeoutData - // this is accessed without further synchronization during actorFor look-ups - @volatile var childrenRefs: TreeMap[String, ChildRestartStats] = emptyChildrenRefs def actorOf(props: Props, name: String): ActorRef = { diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 118e07cd37..230a4d9571 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -245,9 +245,12 @@ class LocalActorRef private[akka] ( * to inject “synthetic” actor paths like “/temp”. */ protected def getSingleChild(name: String): InternalActorRef = { - val children = actorCell.childrenRefs - if (children contains name) children(name).child.asInstanceOf[InternalActorRef] - else Nobody + if (actorCell.isTerminated) Nobody // read of the mailbox status ensures we get the latest childrenRefs + else { + val children = actorCell.childrenRefs + if (children contains name) children(name).child.asInstanceOf[InternalActorRef] + else Nobody + } } def getChild(names: Iterable[String]): InternalActorRef = {