From 07c9bfe6d7b058cd5883e3b62c00a0fd3cc4babf Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 16 May 2012 16:22:59 +0200 Subject: [PATCH] Making sure that the ContinuousCancellable can never be re-initialized --- .../src/main/scala/akka/actor/Scheduler.scala | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 6155cab10c..3bb524ad92 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -5,7 +5,7 @@ package akka.actor import akka.util.Duration -import org.jboss.netty.akka.util.{ TimerTask, HashedWheelTimer, Timeout ⇒ HWTimeout } +import org.jboss.netty.akka.util.{ TimerTask, HashedWheelTimer, Timeout ⇒ HWTimeout, Timer } import akka.event.LoggingAdapter import akka.dispatch.MessageDispatcher import java.io.Closeable @@ -207,14 +207,23 @@ class DefaultScheduler(hashedWheelTimer: HashedWheelTimer, } } +private[akka] object ContinuousCancellable { + val initial: HWTimeout = new HWTimeout { + override def getTimer: Timer = null + override def getTask: TimerTask = null + override def isExpired: Boolean = false + override def isCancelled: Boolean = false + override def cancel: Unit = () + } +} /** * Wrapper of a [[org.jboss.netty.akka.util.Timeout]] that delegates all * methods. Needed to be able to cancel continuous tasks, * since they create new Timeout for each tick. */ -private[akka] class ContinuousCancellable extends AtomicReference[HWTimeout] with Cancellable { +private[akka] class ContinuousCancellable extends AtomicReference[HWTimeout](ContinuousCancellable.initial) with Cancellable { private[akka] def init(initialTimeout: HWTimeout): this.type = { - assert(compareAndSet(null, initialTimeout)) + compareAndSet(ContinuousCancellable.initial, initialTimeout) this }