From 2a370520fd5fd7f8799d35c23950692056c94717 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 21 May 2012 14:50:49 +0200 Subject: [PATCH] Cleaning up the cancellables, null-object pattern ftw --- .../src/main/scala/akka/actor/Scheduler.scala | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 850cb02048..30cadc5a3b 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -216,6 +216,14 @@ private[akka] object ContinuousCancellable { override def isCancelled: Boolean = false override def cancel: Unit = () } + + val cancelled: HWTimeout = new HWTimeout { + override def getTimer: Timer = null + override def getTask: TimerTask = null + override def isExpired: Boolean = false + override def isCancelled: Boolean = true + override def cancel: Unit = () + } } /** * Wrapper of a [[org.jboss.netty.akka.util.Timeout]] that delegates all @@ -229,24 +237,15 @@ private[akka] class ContinuousCancellable extends AtomicReference[HWTimeout](Con } @tailrec private[akka] final def swap(newTimeout: HWTimeout): Unit = get match { - case null ⇒ newTimeout.cancel() - case some if some.isCancelled ⇒ cancel(); newTimeout.cancel() + case some if some.isCancelled ⇒ try cancel() finally newTimeout.cancel() case some ⇒ if (!compareAndSet(some, newTimeout)) swap(newTimeout) } - def isCancelled(): Boolean = get match { - case null ⇒ true - case some ⇒ some.isCancelled() - } - - def cancel(): Unit = - getAndSet(null) match { - case null ⇒ - case some ⇒ some.cancel() - } + def isCancelled(): Boolean = get().isCancelled() + def cancel(): Unit = getAndSet(ContinuousCancellable.cancelled).cancel() } -private[akka] class DefaultCancellable(val timeout: HWTimeout) extends Cancellable { - override def cancel(): Unit = timeout.cancel() - override def isCancelled: Boolean = timeout.isCancelled +private[akka] class DefaultCancellable(timeout: HWTimeout) extends AtomicReference[HWTimeout](timeout) with Cancellable { + override def cancel(): Unit = getAndSet(ContinuousCancellable.cancelled).cancel() + override def isCancelled: Boolean = get().isCancelled }