From ba3a473330361388f78f1a6538319c278e4101d6 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 27 Feb 2011 23:44:04 +0100 Subject: [PATCH] Optimizing for bestcase when sending an actor a message --- .../ExecutorBasedEventDrivenDispatcher.scala | 20 +++++++++++-------- .../scala/akka/dispatch/MessageHandling.scala | 4 +--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala index 8785f0f7dc..3f83887673 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala @@ -125,14 +125,18 @@ class ExecutorBasedEventDrivenDispatcher( } } - private[akka] def registerForExecution(mbox: MessageQueue with ExecutableMailbox): Unit = if (active.isOn) { - if (!mbox.suspended.locked && mbox.dispatcherLock.tryLock()) { - try { - executorService.get() execute mbox - } catch { - case e: RejectedExecutionException => - mbox.dispatcherLock.unlock() - throw e + private[akka] def registerForExecution(mbox: MessageQueue with ExecutableMailbox): Unit = { + if (mbox.dispatcherLock.tryLock()) { + if (active.isOn && !mbox.suspended.locked) { //If the dispatcher is active and the actor not suspended + try { + executorService.get() execute mbox + } catch { + case e: RejectedExecutionException => + mbox.dispatcherLock.unlock() + throw e + } + } else { + mbox.dispatcherLock.unlock() //If the dispatcher isn't active or if the actor is suspended, unlock the dispatcher lock } } } diff --git a/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala index 7efdf549b5..7253b43845 100644 --- a/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala +++ b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala @@ -64,9 +64,7 @@ trait MessageDispatcher { unregister(actorRef) } - private[akka] final def dispatchMessage(invocation: MessageInvocation): Unit = if (active.isOn) { - dispatch(invocation) - } else throw new IllegalActorStateException("Can't submit invocations to dispatcher since it's not started") + private[akka] final def dispatchMessage(invocation: MessageInvocation): Unit = dispatch(invocation) private[akka] def register(actorRef: ActorRef) { if (actorRef.mailbox eq null)