From 51f5454581616b169b235b0a81b4edda26aaa357 Mon Sep 17 00:00:00 2001 From: Raul Bache Date: Mon, 22 Dec 2014 11:35:28 +0100 Subject: [PATCH] =act Constant value made a val to avoid unnecessary allocation Changed the parameter type of targetName in PromiseActorRef#apply and changed so that toString of targetName is called once the value is actually needed, eg in the case of timeout. The creating of the String used in the AskTimeOutException will then be deferred to when timeouts actually occur rather than before, as it was before this change. Callsites of PromiseActorRef#apply are changed so that they instead of ActorSel#toString and ActorRef#toString send the ActorSel / ActorRef itself, thus not creating the Strings from toString unless necessary, saving StringBuilders and char[] used in ActorRef#toString and ActorSel#toString --- .../src/main/scala/akka/pattern/AskSupport.scala | 10 ++++++---- .../main/scala/akka/pattern/GracefulStopSupport.scala | 2 +- .../remote/transport/ThrottlerTransportAdapter.scala | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala index 0340c46eb7..91df600728 100644 --- a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala @@ -138,7 +138,7 @@ final class AskableActorRef(val actorRef: ActorRef) extends AnyVal { if (timeout.duration.length <= 0) Future.failed[Any](new IllegalArgumentException(s"""Timeout length must not be negative, question not sent to [$actorRef]. Sender[$sender] sent the message of type "${message.getClass.getName}".""")) else { - val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef.toString, message, sender) + val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef, message, sender) actorRef.tell(message, a) a.result.future } @@ -159,7 +159,7 @@ final class AskableActorSelection(val actorSel: ActorSelection) extends AnyVal { Future.failed[Any]( new IllegalArgumentException(s"""Timeout length must not be negative, question not sent to [$actorSel]. Sender[$sender] sent the message of type "${message.getClass.getName}".""")) else { - val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel.toString, message, sender) + val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel, message, sender) actorSel.tell(message, a) a.result.future } @@ -299,7 +299,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide @tailrec override def stop(): Unit = { def ensureCompleted(): Unit = { - result tryComplete Failure(new ActorKilledException("Stopped")) + result tryComplete ActorStopResult val watchers = clearWatchers() if (!watchers.isEmpty) { watchers foreach { watcher ⇒ @@ -328,7 +328,9 @@ private[akka] object PromiseActorRef { private case object Stopped private final case class StoppedWithPath(path: ActorPath) - def apply(provider: ActorRefProvider, timeout: Timeout, targetName: String, message: Any, sender: ActorRef = Actor.noSender): PromiseActorRef = { + private val ActorStopResult = Failure(new ActorKilledException("Stopped")) + + def apply(provider: ActorRefProvider, timeout: Timeout, targetName: Any, message: Any, sender: ActorRef = Actor.noSender): PromiseActorRef = { val result = Promise[Any]() val scheduler = provider.guardian.underlying.system.scheduler val a = new PromiseActorRef(provider, result) diff --git a/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala b/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala index af64d0fef6..f0e7e2e7a3 100644 --- a/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala @@ -49,7 +49,7 @@ trait GracefulStopSupport { if (target.isTerminated) Future successful true else { val internalTarget = target.asInstanceOf[InternalActorRef] - val ref = PromiseActorRef(internalTarget.provider, Timeout(timeout), targetName = target.toString, message = stopMessage) + val ref = PromiseActorRef(internalTarget.provider, Timeout(timeout), targetName = target, message = stopMessage) internalTarget.sendSystemMessage(Watch(internalTarget, ref)) target.tell(stopMessage, Actor.noSender) ref.result.future.transform( diff --git a/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala b/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala index 4d2c1a77a6..82c7ca6959 100644 --- a/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala +++ b/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala @@ -298,7 +298,7 @@ private[transport] class ThrottlerManager(wrappedTransport: Transport) extends A if (target.isTerminated) Future successful SetThrottleAck else { val internalTarget = target.asInstanceOf[InternalActorRef] - val ref = PromiseActorRef(internalTarget.provider, timeout, target.toString, mode) + val ref = PromiseActorRef(internalTarget.provider, timeout, target, mode) internalTarget.sendSystemMessage(Watch(internalTarget, ref)) target.tell(mode, ref) ref.result.future.transform({