diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala index 1daddfb5b1..28485c9bad 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala @@ -214,7 +214,7 @@ class ActorSystemSpec extends AkkaSpec("""akka.extensions = ["akka.actor.TestExt EventFilter[Exception]("hello", occurrences = 1) intercept { a ! "die" } - val t = probe.expectMsg(Terminated(a)(true, 0)) + val t = probe.expectMsg(Terminated(a)(true)) t.existenceConfirmed must be(true) } diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index 2a977d72c6..77e1add959 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -63,10 +63,7 @@ case object Kill extends Kill { * When Death Watch is used, the watcher will receive a Terminated(watched) message when watched is terminated. */ @SerialVersionUID(1L) -case class Terminated private[akka] (@BeanProperty actor: ActorRef)( - @BeanProperty val existenceConfirmed: Boolean, - private[akka] val uid: Int) - extends AutoReceivedMessage +case class Terminated private[akka] (@BeanProperty actor: ActorRef)(@BeanProperty val existenceConfirmed: Boolean) extends AutoReceivedMessage abstract class ReceiveTimeout extends PossiblyHarmful diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index bf6ae5731c..1699a27505 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -375,14 +375,8 @@ private[akka] class ActorCell( publish(Debug(self.path.toString, clazz(actor), "received AutoReceiveMessage " + msg)) msg.message match { - case Failed(cause, uid) ⇒ handleFailure(sender, cause, uid) - case t @ Terminated(actor) ⇒ - getChildByRef(actor) match { - case Some(crs) if crs.uid == t.uid ⇒ removeChild(actor) - case _ ⇒ - } - watchedActorTerminated(t.actor) - receiveMessage(t) + case Failed(cause, uid) ⇒ handleFailure(sender, cause, uid) + case t: Terminated ⇒ watchedActorTerminated(t.actor); receiveMessage(t) case Kill ⇒ throw new ActorKilledException("Kill") case PoisonPill ⇒ self.stop() case SelectParent(m) ⇒ parent.tell(m, msg.sender) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 13225165f1..c5e49ece70 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -441,7 +441,7 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider, protected def specialHandle(msg: Any): Boolean = msg match { case w: Watch ⇒ if (w.watchee == this && w.watcher != this) - w.watcher ! Terminated(w.watchee)(existenceConfirmed = false, 0) + w.watcher ! Terminated(w.watchee)(existenceConfirmed = false) true case _: Unwatch ⇒ true // Just ignore case _ ⇒ false @@ -466,10 +466,11 @@ private[akka] class DeadLetterActorRef(_provider: ActorRefProvider, override protected def specialHandle(msg: Any): Boolean = msg match { case w: Watch ⇒ if (w.watchee != this && w.watcher != this) - w.watcher ! Terminated(w.watchee)(existenceConfirmed = false, 0) + w.watcher ! Terminated(w.watchee)(existenceConfirmed = false) true - case w: Unwatch ⇒ true // Just ignore - case _ ⇒ false + case w: Unwatch ⇒ true // Just ignore + case NullMessage ⇒ true + case _ ⇒ false } @throws(classOf[java.io.ObjectStreamException]) diff --git a/akka-actor/src/main/scala/akka/actor/cell/Children.scala b/akka-actor/src/main/scala/akka/actor/cell/Children.scala index c0988fe13c..53b4dfb99e 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/cell/Children.scala @@ -94,7 +94,7 @@ private[akka] trait Children { this: ActorCell ⇒ swapChildrenRefs(c, c.shallDie(ref)) || shallDie(ref) } - @tailrec final protected def removeChild(ref: ActorRef): ChildrenContainer = { + @tailrec final private def removeChild(ref: ActorRef): ChildrenContainer = { val c = childrenRefs val n = c.remove(ref) if (swapChildrenRefs(c, n)) n diff --git a/akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala b/akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala index 2c78075764..031019f3f6 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala +++ b/akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala @@ -36,7 +36,7 @@ private[akka] trait DeathWatch { this: ActorCell ⇒ protected def tellWatchersWeDied(actor: Actor): Unit = { if (!watchedBy.isEmpty) { - val terminated = Terminated(self)(existenceConfirmed = true, uid) + val terminated = Terminated(self)(existenceConfirmed = true) try { watchedBy foreach { watcher ⇒ diff --git a/akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala index 4e5eeedcc6..0c0f9bb9c0 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala @@ -11,6 +11,7 @@ import akka.event.Logging.{ Warning, Error, Debug } import scala.util.control.NonFatal import akka.dispatch.SystemMessage import akka.event.Logging +import akka.dispatch.NullMessage private[akka] trait FaultHandling { this: ActorCell ⇒ @@ -157,6 +158,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ try if (a ne null) a.postStop() finally try dispatcher.detach(this) finally try parent.sendSystemMessage(ChildTerminated(self)) + finally try parent.tell(NullMessage) // read ScalaDoc of NullMessage to see why finally try tellWatchersWeDied(a) finally try unwatchWatchedActors(a) finally { diff --git a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala index ba9558aa84..345d133ea4 100644 --- a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala @@ -262,7 +262,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide case _: Terminate ⇒ stop() case Watch(watchee, watcher) ⇒ if (watchee == this && watcher != this) { - if (!addWatcher(watcher)) watcher ! Terminated(watchee)(existenceConfirmed = true, 0) + if (!addWatcher(watcher)) watcher ! Terminated(watchee)(existenceConfirmed = true) } else System.err.println("BUG: illegal Watch(%s,%s) for %s".format(watchee, watcher, this)) case Unwatch(watchee, watcher) ⇒ if (watchee == this && watcher != this) remWatcher(watcher) @@ -281,7 +281,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide result tryComplete Failure(new ActorKilledException("Stopped")) val watchers = clearWatchers() if (!watchers.isEmpty) { - val termination = Terminated(this)(existenceConfirmed = true, 0) + val termination = Terminated(this)(existenceConfirmed = true) watchers foreach { w ⇒ try w.tell(termination, this) catch { case NonFatal(t) ⇒ /* FIXME LOG THIS */ } } } } diff --git a/akka-docs/java/code/docs/actor/FaultHandlingTestBase.java b/akka-docs/java/code/docs/actor/FaultHandlingTestBase.java index 75d732427a..6f31be6ef4 100644 --- a/akka-docs/java/code/docs/actor/FaultHandlingTestBase.java +++ b/akka-docs/java/code/docs/actor/FaultHandlingTestBase.java @@ -211,4 +211,4 @@ public class FaultHandlingTestBase { } //#testkit } -//#testkit \ No newline at end of file +//#testkit diff --git a/akka-docs/scala/code/docs/actor/FaultHandlingDocSpec.scala b/akka-docs/scala/code/docs/actor/FaultHandlingDocSpec.scala index 0387c6e6a6..c5aff099da 100644 --- a/akka-docs/scala/code/docs/actor/FaultHandlingDocSpec.scala +++ b/akka-docs/scala/code/docs/actor/FaultHandlingDocSpec.scala @@ -153,4 +153,4 @@ class FaultHandlingDocSpec extends AkkaSpec with ImplicitSender { } } } -//#testkit \ No newline at end of file +//#testkit