From a413a9394b3d54c9e26bb5e58dcd03a22bc1ddb5 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 29 May 2012 16:36:24 +0200 Subject: [PATCH] Switching approaches for EmptyLocalActorRef and DeadLetterActorRef --- .../src/main/scala/akka/actor/ActorRef.scala | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 042a5cdd6a..a713a61ddc 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -415,15 +415,20 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider, override def isTerminated(): Boolean = true - override def sendSystemMessage(message: SystemMessage): Unit = message match { - case Watch(watchee, watcher) ⇒ if (watchee == this && watcher != this) watcher ! Terminated(watchee)(stopped = false) - case _ ⇒ - } + override def sendSystemMessage(message: SystemMessage): Unit = specialHandle(message) override def !(message: Any)(implicit sender: ActorRef = null): Unit = message match { - case DeadLetter(w: Watch, _, _) ⇒ sendSystemMessage(w) - case d: DeadLetter ⇒ // do NOT form endless loops, since deadLetters will resend! - case _ ⇒ eventStream.publish(DeadLetter(message, sender, this)) + case d: DeadLetter ⇒ specialHandle(d.message) // do NOT form endless loops, since deadLetters will resend! + case _ ⇒ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this)) + } + + protected def specialHandle(msg: Any): Boolean = msg match { + case w: Watch ⇒ + if (w.watchee == this && w.watcher != this) w.watcher ! Terminated(w.watchee)(stopped = false) + + true + case w: Unwatch ⇒ true // Just ignore + case _ ⇒ false } } @@ -437,15 +442,18 @@ private[akka] class DeadLetterActorRef(_provider: ActorRefProvider, _path: ActorPath, _eventStream: EventStream) extends EmptyLocalActorRef(_provider, _path, _eventStream) { - override def sendSystemMessage(message: SystemMessage): Unit = message match { - case Watch(watchee, watcher) ⇒ if (watchee != this && watcher != this) watcher ! Terminated(watchee)(stopped = false) - case _ ⇒ + override def !(message: Any)(implicit sender: ActorRef = this): Unit = message match { + case d: DeadLetter ⇒ if (!specialHandle(d.message)) eventStream.publish(d) + case _ ⇒ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this)) } - override def !(message: Any)(implicit sender: ActorRef = this): Unit = message match { - case DeadLetter(w: Watch, _, _) ⇒ sendSystemMessage(w) - case d: DeadLetter ⇒ eventStream.publish(d) - case _ ⇒ eventStream.publish(DeadLetter(message, sender, this)) + override protected def specialHandle(msg: Any): Boolean = msg match { + case w: Watch ⇒ + if (w.watchee != this && w.watcher != this) w.watcher ! Terminated(w.watchee)(stopped = false) + + true + case w: Unwatch ⇒ true // Just ignore + case _ ⇒ false } @throws(classOf[java.io.ObjectStreamException])