Cleaning up the cancellables, null-object pattern ftw

This commit is contained in:
Viktor Klang 2012-05-21 14:50:49 +02:00
parent 3ba5db053a
commit 2a370520fd

View file

@ -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
}