From 1fc7532142c3e6129ee44d2e26771bb65c6be225 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Tue, 9 Nov 2010 13:17:10 +1300 Subject: [PATCH] Some tidy up --- .../src/main/scala/actor/Transactor.scala | 4 +++ akka-stm/src/main/scala/stm/Coordinated.scala | 4 +++ akka-stm/src/main/scala/stm/Ref.scala | 28 +++++++++++-------- akka-stm/src/main/scala/stm/Stm.scala | 12 +++++++- .../src/main/scala/stm/TransactionalMap.scala | 10 ++----- .../main/scala/stm/TransactionalVector.scala | 10 ++----- 6 files changed, 41 insertions(+), 27 deletions(-) diff --git a/akka-stm/src/main/scala/actor/Transactor.scala b/akka-stm/src/main/scala/actor/Transactor.scala index a23db1de7a..b539439d68 100644 --- a/akka-stm/src/main/scala/actor/Transactor.scala +++ b/akka-stm/src/main/scala/actor/Transactor.scala @@ -1,3 +1,7 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + package akka.actor import akka.stm.{Coordinated, DefaultTransactionConfig, TransactionFactory} diff --git a/akka-stm/src/main/scala/stm/Coordinated.scala b/akka-stm/src/main/scala/stm/Coordinated.scala index a722dc3636..3a57fd0ffc 100644 --- a/akka-stm/src/main/scala/stm/Coordinated.scala +++ b/akka-stm/src/main/scala/stm/Coordinated.scala @@ -1,3 +1,7 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + package akka.stm import akka.config.Config diff --git a/akka-stm/src/main/scala/stm/Ref.scala b/akka-stm/src/main/scala/stm/Ref.scala index 3c5237388a..398ab82eee 100644 --- a/akka-stm/src/main/scala/stm/Ref.scala +++ b/akka-stm/src/main/scala/stm/Ref.scala @@ -63,33 +63,37 @@ class Ref[T](initialValue: T) extends BasicRef[T](initialValue) with Transaction val uuid = newUuid.toString - def swap(elem: T) = set(elem) + def apply() = get + + def update(newValue: T) = set(newValue) + + def swap(newValue: T) = set(newValue) def alter(f: T => T): T = { - val value = f(this.get) + val value = f(get) set(value) value } - def opt: Option[T] = Option(this.get) + def opt: Option[T] = Option(get) def getOrWait: T = getOrAwait def getOrElse(default: => T): T = - if (isNull) default else this.get + if (isNull) default else get def isDefined: Boolean = !isNull def isEmpty: Boolean = isNull def map[B](f: T => B): Ref[B] = - if (isEmpty) Ref[B] else Ref(f(this.get)) + if (isEmpty) Ref[B] else Ref(f(get)) def flatMap[B](f: T => Ref[B]): Ref[B] = - if (isEmpty) Ref[B] else f(this.get) + if (isEmpty) Ref[B] else f(get) def filter(p: T => Boolean): Ref[T] = - if (isDefined && p(this.get)) Ref(this.get) else Ref[T] + if (isDefined && p(get)) Ref(get) else Ref[T] /** * Necessary to keep from being implicitly converted to Iterable in for comprehensions. @@ -104,17 +108,17 @@ class Ref[T](initialValue: T) extends BasicRef[T](initialValue) with Transaction } def foreach[U](f: T => U): Unit = - if (isDefined) f(this.get) + if (isDefined) f(get) def elements: Iterator[T] = - if (isEmpty) Iterator.empty else Iterator(this.get) + if (isEmpty) Iterator.empty else Iterator(get) def toList: List[T] = - if (isEmpty) List() else List(this.get) + if (isEmpty) List() else List(get) def toRight[X](left: => X) = - if (isEmpty) Left(left) else Right(this.get) + if (isEmpty) Left(left) else Right(get) def toLeft[X](right: => X) = - if (isEmpty) Right(right) else Left(this.get) + if (isEmpty) Right(right) else Left(get) } diff --git a/akka-stm/src/main/scala/stm/Stm.scala b/akka-stm/src/main/scala/stm/Stm.scala index 44f639ae22..2ca9844442 100644 --- a/akka-stm/src/main/scala/stm/Stm.scala +++ b/akka-stm/src/main/scala/stm/Stm.scala @@ -8,6 +8,16 @@ import org.multiverse.api.{StmUtils => MultiverseStmUtils} import org.multiverse.api.{Transaction => MultiverseTransaction} import org.multiverse.templates.{TransactionalCallable, OrElseTemplate} +object Stm { + /** + * Check whether there is an active Multiverse transaction. + */ + def activeTransaction() = { + val tx = org.multiverse.api.ThreadLocalTransaction.getThreadLocalTransaction + (tx ne null) && !tx.getStatus.isDead + } +} + /** * Defines the atomic block for local transactions. Automatically imported with: * @@ -122,7 +132,7 @@ trait StmUtil { * STM retry for blocking transactions (use within an atomic). * Can be used to wait for a condition. */ - def retry = MultiverseStmUtils.retry + def retry() = MultiverseStmUtils.retry /** * Use either-orElse to combine two blocking transactions. diff --git a/akka-stm/src/main/scala/stm/TransactionalMap.scala b/akka-stm/src/main/scala/stm/TransactionalMap.scala index ab7fe7341b..a149171763 100644 --- a/akka-stm/src/main/scala/stm/TransactionalMap.scala +++ b/akka-stm/src/main/scala/stm/TransactionalMap.scala @@ -8,8 +8,6 @@ import scala.collection.immutable.HashMap import akka.actor.{newUuid} -import org.multiverse.api.ThreadLocalTransaction.getThreadLocalTransaction - /** * Transactional map that implements the mutable Map interface with an underlying Ref and HashMap. */ @@ -21,13 +19,13 @@ object TransactionalMap { /** * Transactional map that implements the mutable Map interface with an underlying Ref and HashMap. - *

+ * * TransactionalMap and TransactionalVector look like regular mutable datastructures, they even * implement the standard Scala 'Map' and 'IndexedSeq' interfaces, but they are implemented using * persistent datastructures and managed references under the hood. Therefore they are safe to use * in a concurrent environment through the STM. Underlying TransactionalMap is HashMap, an immutable * Map but with near constant time access and modification operations. - *

+ * * From Scala you can use TMap as a shorter alias for TransactionalMap. */ class TransactionalMap[K, V](initialValue: HashMap[K, V]) extends Transactional with scala.collection.mutable.Map[K, V] { @@ -87,7 +85,5 @@ class TransactionalMap[K, V](initialValue: HashMap[K, V]) extends Transactional other.isInstanceOf[TransactionalMap[_, _]] && other.hashCode == hashCode - override def toString = if (outsideTransaction) "" else super.toString - - def outsideTransaction = getThreadLocalTransaction eq null + override def toString = if (Stm.activeTransaction) super.toString else "" } diff --git a/akka-stm/src/main/scala/stm/TransactionalVector.scala b/akka-stm/src/main/scala/stm/TransactionalVector.scala index dbb6eda307..b3ef8fea34 100644 --- a/akka-stm/src/main/scala/stm/TransactionalVector.scala +++ b/akka-stm/src/main/scala/stm/TransactionalVector.scala @@ -8,7 +8,6 @@ import scala.collection.immutable.Vector import akka.actor.newUuid -import org.multiverse.api.ThreadLocalTransaction.getThreadLocalTransaction /** * Transactional vector that implements the IndexedSeq interface with an underlying Ref and Vector. @@ -21,13 +20,13 @@ object TransactionalVector { /** * Transactional vector that implements the IndexedSeq interface with an underlying Ref and Vector. - *

+ * * TransactionalMap and TransactionalVector look like regular mutable datastructures, they even * implement the standard Scala 'Map' and 'IndexedSeq' interfaces, but they are implemented using * persistent datastructures and managed references under the hood. Therefore they are safe to use * in a concurrent environment through the STM. Underlying TransactionalVector is Vector, an immutable * sequence but with near constant time access and modification operations. - *

+ * * From Scala you can use TVector as a shorter alias for TransactionalVector. */ class TransactionalVector[T](initialValue: Vector[T]) extends Transactional with IndexedSeq[T] { @@ -62,9 +61,6 @@ class TransactionalVector[T](initialValue: Vector[T]) extends Transactional with other.isInstanceOf[TransactionalVector[_]] && other.hashCode == hashCode - override def toString = if (outsideTransaction) "" else super.toString - - def outsideTransaction = - org.multiverse.api.ThreadLocalTransaction.getThreadLocalTransaction eq null + override def toString = if (Stm.activeTransaction) super.toString else "" }