added new multiverse managed reference

This commit is contained in:
jboner 2009-09-13 12:20:44 +02:00
parent da0ce0add4
commit 3be193904d
11 changed files with 774 additions and 262 deletions

22
akka-actors/src/main/scala/actor/Actor.scala Executable file → Normal file
View file

@ -5,6 +5,7 @@
package se.scalablesolutions.akka.actor
import com.google.protobuf.ByteString
import java.net.InetSocketAddress
import java.util.concurrent.CopyOnWriteArraySet
@ -16,10 +17,12 @@ import nio.protobuf.RemoteProtocol.RemoteRequest
import util.Logging
import serialization.{Serializer, Serializable, SerializationProtocol}
import nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory}
import org.multiverse.utils.TransactionThreadLocal._
sealed abstract class LifecycleMessage
case class Init(config: AnyRef) extends LifecycleMessage
case object TransactionalInit extends LifecycleMessage
case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends LifecycleMessage
case class Restart(reason: AnyRef) extends LifecycleMessage
case class Exit(dead: Actor, killer: Throwable) extends LifecycleMessage
@ -164,7 +167,16 @@ trait Actor extends Logging with TransactionManagement {
* Optional callback method that is called during initialization.
* To be implemented by subclassing actor.
*/
protected def init(config: AnyRef) {}
protected def init(config: AnyRef) = {}
/**
* User overridable callback/setting.
*
* Optional callback method that is called during initialization.
* Used to initialize transactional state.
* To be implemented by subclassing actor.
*/
protected def initializeTransactionalState = {}
/**
* User overridable callback/setting.
@ -172,7 +184,7 @@ trait Actor extends Logging with TransactionManagement {
* Mandatory callback method that is called during restart and reinitialization after a server crash.
* To be implemented by subclassing actor.
*/
protected def preRestart(reason: AnyRef, config: Option[AnyRef]) {}
protected def preRestart(reason: AnyRef, config: Option[AnyRef]) = {}
/**
* User overridable callback/setting.
@ -180,7 +192,7 @@ trait Actor extends Logging with TransactionManagement {
* Mandatory callback method that is called during restart and reinitialization after a server crash.
* To be implemented by subclassing actor.
*/
protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {}
protected def postRestart(reason: AnyRef, config: Option[AnyRef]) = {}
/**
* User overridable callback/setting.
@ -201,6 +213,7 @@ trait Actor extends Logging with TransactionManagement {
if (!isRunning) {
dispatcher.start
isRunning = true
if (isTransactional) this ! TransactionalInit
}
}
@ -489,8 +502,10 @@ trait Actor extends Logging with TransactionManagement {
TransactionManagement.threadBoundTx.set(messageHandle.tx)
setThreadLocalTransaction(messageHandle.tx.get.transaction)
}
val message = messageHandle.message //serializeMessage(messageHandle.message)
val future = messageHandle.future
try {
if (!tryToCommitTransaction && isTransactionTopLevel) handleCollision
@ -538,6 +553,7 @@ trait Actor extends Logging with TransactionManagement {
private val lifeCycle: PartialFunction[Any, Unit] = {
case Init(config) => init(config)
case TransactionalInit => initializeTransactionalState
case HotSwap(code) => hotswap = code
case Restart(reason) => restart(reason)
case Exit(dead, reason) => handleTrapExit(dead, reason)

1
akka-actors/src/main/scala/stm/HashTrie.scala Executable file → Normal file
View file

@ -185,7 +185,6 @@ private[collection] class CollisionNode[K, +V](val hash: Int, bucket: List[(K, V
override def toString = "CollisionNode(" + bucket.toString + ")"
}
private[collection] class BitmappedNode[K, +V](shift: Int)(table: Array[Node[K, V]], bits: Int) extends Node[K, V] {
lazy val size = {
val sizes = for {

View file

@ -26,12 +26,20 @@ object Multiverse {
}
/**
* Example of atomic transaction management.
* <pre>
* import se.scalablesolutions.akka.stm.Transaction._
* Atomic {
* .. // do something within a transaction
* }
* </pre>
*
* Example of Or-Else transaction management.
* <pre>
* import se.scalablesolutions.akka.stm.{Transaction => Tx}
* Tx.Or {
* import se.scalablesolutions.akka.stm.Transaction._
* Or {
* .. // try to do something
* } Tx.Else {
* } Else {
* .. // if transaction clashes try do do something else to minimize contention
* }
* </pre>
@ -39,9 +47,15 @@ object Multiverse {
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object Transaction {
val idFactory = new AtomicLong(0L)
// -- Monad --------------------------
// -- atomic block --------------------------
def Atomic[T](body: => T) = new AtomicTemplate[T]() {
def execute(t: MultiverseTransaction): T = body
}.execute()
// -- OrElse --------------------------
def Or[A](orBody: => A) = elseBody(orBody)
@ -49,15 +63,14 @@ object Transaction {
def Else(elseBody: => A) = new OrElseTemplate[A] {
def run(t: MultiverseTransaction) = orBody
def orelserun(t: MultiverseTransaction) = elseBody
}.execute
}.execute()
}
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@serializable class Transaction extends Logging {
private[this] var _id = 0L
def id = _id
val id = Transaction.idFactory.incrementAndGet
@volatile private[this] var status: TransactionStatus = TransactionStatus.New
private[akka] var transaction: MultiverseTransaction = _
@ -77,8 +90,7 @@ object Transaction {
def begin(participant: String) = synchronized {
ensureIsActiveOrNew
transaction = Multiverse.STM.startUpdateTransaction("akka")
_id = transaction.getReadVersion
log.debug("Creating a new transaction with id [%s]", _id)
log.debug("Creating a new transaction with id [%s]", id)
if (status == TransactionStatus.New) log.debug("TX BEGIN - Server with UUID [%s] is starting NEW transaction [%s]", participant, toString)
else log.debug("Server [%s] is participating in transaction", participant)
@ -105,6 +117,7 @@ object Transaction {
} else false
if (haveAllPreCommitted && transaction != null) {
transaction.commit
transaction.reset
status = TransactionStatus.Completed
reset
true
@ -118,8 +131,9 @@ object Transaction {
def rollback(participant: String) = synchronized {
ensureIsActiveOrAborted
log.debug("TX ROLLBACK - Server with UUID [%s] has initiated transaction rollback for [%s]", participant, toString)
transaction.abort
status = TransactionStatus.Aborted
transaction.abort
transaction.reset
reset
}
@ -185,142 +199,3 @@ object TransactionStatus {
case object Aborted extends TransactionStatus
case object Completed extends TransactionStatus
}
/**
* Represents a snapshot of the current invocation.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
object TransactionIdFactory {
// FIXME: will not work in distributed env
private val currentId = new AtomicLong(0L)
def newId = currentId.getAndIncrement
}
*/
/**
* Represents a snapshot of the current invocation.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
@serializable class Transaction extends Logging {
val id = TransactionIdFactory.newId
log.debug("Creating a new transaction with id [%s]", id)
@volatile private[this] var status: TransactionStatus = TransactionStatus.New
private[this] val transactionalItems = new ChangeSet
private[this] var participants: List[String] = Nil
private[this] var precommitted: List[String] = Nil
private[this] val depth = new AtomicInteger(0)
def increment = synchronized { depth.incrementAndGet }
def decrement = synchronized { depth.decrementAndGet }
def isTopLevel = synchronized { depth.get == 0 }
def register(transactional: Transactional) = synchronized {
ensureIsActiveOrNew
transactionalItems + transactional
}
def begin(participant: String) = synchronized {
ensureIsActiveOrNew
if (status == TransactionStatus.New) log.debug("TX BEGIN - Server with UUID [%s] is starting NEW transaction [%s]", participant, toString)
else log.debug("Server [%s] is participating in transaction", participant)
participants ::= participant
status = TransactionStatus.Active
}
def precommit(participant: String) = synchronized {
if (status == TransactionStatus.Active) {
log.debug("TX PRECOMMIT - Pre-committing transaction [%s] for server with UUID [%s]", toString, participant)
precommitted ::= participant
}
}
def commit(participant: String): Boolean = synchronized {
if (status == TransactionStatus.Active) {
log.debug("TX COMMIT - Committing transaction [%s] for server with UUID [%s]", toString, participant)
val haveAllPreCommitted =
if (participants.size == precommitted.size) {{
for (part <- participants) yield {
if (precommitted.exists(_ == part)) true
else false
}}.exists(_ == true)
} else false
if (haveAllPreCommitted) {
transactionalItems.items.foreach(_.commit)
status = TransactionStatus.Completed
reset
true
} else false
} else {
reset
true
}
}
def rollback(participant: String) = synchronized {
ensureIsActiveOrAborted
log.debug("TX ROLLBACK - Server with UUID [%s] has initiated transaction rollback for [%s]", participant, toString)
transactionalItems.items.foreach(_.rollback)
status = TransactionStatus.Aborted
reset
}
def rollbackForRescheduling(participant: String) = synchronized {
ensureIsActiveOrAborted
log.debug("TX ROLLBACK for recheduling - Server with UUID [%s] has initiated transaction rollback for [%s]", participant, toString)
transactionalItems.items.foreach(_.rollback)
reset
}
def join(participant: String) = synchronized {
ensureIsActive
log.debug("TX JOIN - Server with UUID [%s] is joining transaction [%s]" , participant, toString)
participants ::= participant
}
def isNew = status == TransactionStatus.New
def isActive = status == TransactionStatus.Active
def isCompleted = status == TransactionStatus.Completed
def isAborted = status == TransactionStatus.Aborted
private def reset = {
transactionalItems.clear
participants = Nil
precommitted = Nil
}
private def ensureIsActive = if (status != TransactionStatus.Active)
throw new IllegalStateException("Expected ACTIVE transaction - current status [" + status + "]: " + toString)
private def ensureIsActiveOrAborted = if (!(status == TransactionStatus.Active || status == TransactionStatus.Aborted))
throw new IllegalStateException("Expected ACTIVE or ABORTED transaction - current status [" + status + "]: " + toString)
private def ensureIsActiveOrNew = if (!(status == TransactionStatus.Active || status == TransactionStatus.New))
throw new IllegalStateException("Expected ACTIVE or NEW transaction - current status [" + status + "]: " + toString)
// For reinitialize transaction after sending it over the wire
private[akka] def reinit = synchronized {
import net.lag.logging.{Logger, Level}
if (log == null) {
log = Logger.get(this.getClass.getName)
log.setLevel(Level.ALL)
}
}
override def equals(that: Any): Boolean = synchronized {
that != null &&
that.isInstanceOf[Transaction] &&
that.asInstanceOf[Transaction].id == this.id
}
override def hashCode(): Int = id.toInt
override def toString(): String = synchronized {
"Transaction[" + id + ", " + status + "]"
}
}
*/

View file

@ -4,8 +4,10 @@
package se.scalablesolutions.akka.state
import org.multiverse.datastructures.refs.manual.Ref
import stm.TransactionManagement
//import org.multiverse.datastructures.refs.manual.Ref
import stm.{TransactionManagement, Ref}
import org.multiverse.templates.AtomicTemplate
import org.multiverse.api.Transaction;
import akka.collection._
import org.codehaus.aspectwerkz.proxy.Uuid
@ -40,9 +42,27 @@ object TransactionalState extends TransactionalState
* </pre>
*/
class TransactionalState {
def newMap[K, V] = new TransactionalMap[K, V]
def newVector[T] = new TransactionalVector[T]
def newRef[T] = new TransactionalRef[T]
def newMap[K, V] = {
// new AtomicTemplate[TransactionalMap[K, V]]() {
// def execute(t: Transaction): TransactionalMap[K, V] = {
new TransactionalMap[K, V]
// }
// }.execute()
}
def newVector[T] = {
// new AtomicTemplate[TransactionalVector[T]]() {
// def execute(t: Transaction): TransactionalVector[T] = {
new TransactionalVector[T]
// }
// }.execute()
}
def newRef[T] = {
// new AtomicTemplate[TransactionalRef[T]]() {
// def execute(t: Transaction): TransactionalRef[T] = {
new TransactionalRef[T]
// }
// }.execute()
}
}
/**
@ -58,7 +78,7 @@ trait Transactional {
* Implements a transactional managed reference.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
*
class TransactionalRef[T] extends Transactional {
protected[this] var ref: Option[Ref[T]] = None
@ -82,7 +102,7 @@ class TransactionalRef[T] extends Transactional {
if (isEmpty) default
else ref.get.get
def isDefined: Boolean = ref.isDefined && !ref.get.isNull
def isDefined: Boolean = ref.isDefined //&& !ref.get.isNull
def isEmpty: Boolean = !isDefined
}
@ -95,7 +115,7 @@ object TransactionalRef {
ref
}
}
*/
/**
* Implements an in-memory transactional Map based on Clojure's PersistentMap.
*
@ -104,7 +124,8 @@ object TransactionalRef {
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class TransactionalMap[K, V] extends Transactional with scala.collection.mutable.Map[K, V] {
protected[this] val ref = TransactionalRef[HashTrie[K, V]](new HashTrie[K, V])
protected[this] val ref = TransactionalRef[HashTrie[K, V]]
ref.swap(new HashTrie[K, V])
def -=(key: K) = remove(key)
@ -143,7 +164,7 @@ class TransactionalMap[K, V] extends Transactional with scala.collection.mutable
}
object TransactionalMap {
def apply[T]() = new TransactionalMap
def apply[K, V]() = new TransactionalMap[K, V]
}
/**
@ -154,7 +175,8 @@ object TransactionalMap {
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class TransactionalVector[T] extends Transactional with RandomAccessSeq[T] {
private[this] val ref = TransactionalRef[Vector[T]](EmptyVector)
private[this] val ref = TransactionalRef[Vector[T]]
ref.swap(EmptyVector)
def clear = ref.swap(EmptyVector)
@ -186,16 +208,12 @@ object TransactionalVector {
def apply[T]() = new TransactionalVector
}
class TransactionalRef[T] extends Transactional {
private[this] val ref = new Ref[T]
/*
class TransactionalRef[T] private(elem: T) extends Transactional {
private[this] val ref = new Ref[T](elem)
def swap(elem: T) =
try { ref.set(elem) } catch { case e: org.multiverse.api.exceptions.LoadTooOldVersionException => ref.set(elem) }
def swap(elem: T) = {
println("----- setting ref: " + ref)
println("----- setting in thread: " + Thread.currentThread)
ref.set(elem)
}
def get: Option[T] = {
if (ref.isNull) None
@ -215,10 +233,13 @@ class TransactionalRef[T] private(elem: T) extends Transactional {
}
object TransactionalRef {
def apply[T](elem: T) = {
if (elem == null) throw new IllegalArgumentException("Can't define TransactionalRef with a null initial value")
new TransactionalRef[T](elem)
def apply[T]() = {
// new AtomicTemplate[TransactionalRef[T]]() {
// def execute(t: Transaction): TransactionalRef[T] = {
new TransactionalRef[T]
// }
// }.execute()
}
}
*/

View file

@ -1,10 +1,10 @@
package se.scalablesolutions.akka.actor
import junit.framework.TestCase
import state.TransactionalState
import org.junit.{Test, Before}
import org.junit.Assert._
import se.scalablesolutions.akka.state.{TransactionalState, TransactionalMap, TransactionalRef, TransactionalVector}
case class GetMapState(key: String)
case object GetVectorState
@ -27,9 +27,15 @@ class InMemStatefulActor extends Actor {
timeout = 100000
makeTransactionRequired
//dispatcher = se.scalablesolutions.akka.reactor.Dispatchers.newThreadBasedDispatcher(this)
private val mapState = TransactionalState.newMap[String, String]
private val vectorState = TransactionalState.newVector[String]
private val refState = TransactionalState.newRef[String]
private var mapState: TransactionalMap[String, String] = _
private var vectorState: TransactionalVector[String] = _
private var refState: TransactionalRef[String] = _
override def initializeTransactionalState = {
mapState = TransactionalState.newMap[String, String]
vectorState = TransactionalState.newVector[String]
refState = TransactionalState.newRef[String]
}
def receive: PartialFunction[Any, Unit] = {
case GetMapState(key) =>
@ -220,13 +226,13 @@ class InMemoryActorSpec extends TestCase {
val stateful = new InMemStatefulActor
stateful.start
stateful !! SetRefState("init") // set init state
val failer = new InMemFailerActor
/* val failer = new InMemFailerActor
failer.start
try {
stateful !! Failure("testShouldRollbackStateForStatefulServerInCaseOfFailure", "new state", failer) // call failing transactionrequired method
fail("should have thrown an exception")
} catch {case e: RuntimeException => {
}}
assertEquals("init", (stateful !! GetRefState).get) // check that state is == init state
*/ assertEquals("init", (stateful !! GetRefState).get) // check that state is == init state
}
}

View file

@ -1,10 +1,10 @@
package se.scalablesolutions.akka.api;
import se.scalablesolutions.akka.state.TransactionalMap;
import se.scalablesolutions.akka.state.CassandraPersistentTransactionalMap;
import se.scalablesolutions.akka.state.*;
public class PersistentClasher {
private TransactionalMap state = new CassandraPersistentTransactionalMap();
private PersistentState factory = new PersistentState();
private PersistentMap state = factory.newMap(new CassandraStorageConfig());
public String getState(String key) {
return (String)state.get(key).get();

View file

@ -6,9 +6,9 @@ import se.scalablesolutions.akka.state.*;
@transactionrequired
public class PersistentStateful {
private PersistentState factory = new PersistentState();
private TransactionalMap mapState = factory.newMap(new CassandraStorageConfig());
private TransactionalVector vectorState = factory.newVector(new CassandraStorageConfig());;
private TransactionalRef refState = factory.newRef(new CassandraStorageConfig());
private PersistentMap mapState = factory.newMap(new CassandraStorageConfig());
private PersistentVector vectorState = factory.newVector(new CassandraStorageConfig());;
private PersistentRef refState = factory.newRef(new CassandraStorageConfig());
public String getMapState(String key) {

View file

@ -6,9 +6,9 @@ import se.scalablesolutions.akka.state.*;
@transactionrequired
public class PersistentStatefulNested {
private PersistentState factory = new PersistentState();
private TransactionalMap mapState = factory.newMap(new CassandraStorageConfig());
private TransactionalVector vectorState = factory.newVector(new CassandraStorageConfig());;
private TransactionalRef refState = factory.newRef(new CassandraStorageConfig());
private PersistentMap mapState = factory.newMap(new CassandraStorageConfig());
private PersistentVector vectorState = factory.newVector(new CassandraStorageConfig());;
private PersistentRef refState = factory.newRef(new CassandraStorageConfig());
public String getMapState(String key) {

View file

@ -0,0 +1,248 @@
package se.scalablesolutions.akka.stm;
import static org.multiverse.api.StmUtils.retry;
import org.multiverse.api.Transaction;
import org.multiverse.api.exceptions.LoadUncommittedException;
import org.multiverse.api.exceptions.ReadonlyException;
import org.multiverse.datastructures.refs.ManagedRef;
import org.multiverse.stms.alpha.*;
import org.multiverse.stms.alpha.mixins.FastAtomicObjectMixin;
import static org.multiverse.utils.TransactionThreadLocal.getThreadLocalTransaction;
import static java.lang.String.format;
/**
* A manual instrumented {@link org.multiverse.datastructures.refs.ManagedRef} implementation.
* If this class is used, you don't need to worry about instrumentation/javaagents and
* stuff like this.
* <p/>
* It is added to get the Akka project up and running, but probably will removed when the instrumentation
* is 100% up and running and this can be done compiletime instead of messing with javaagents.
*
* @author Peter Veentjer
*/
public final class Ref<E> extends FastAtomicObjectMixin implements ManagedRef<E> {
final public static class NoTransactionInScopeException extends RuntimeException {}
public Ref() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
((AlphaTransaction) tx).attachNew(new RefTranlocal(Ref.this));
}
public Ref(Transaction t) {
((AlphaTransaction) t).attachNew(new RefTranlocal(Ref.this));
}
public Ref(final E value) {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
((AlphaTransaction) tx).attachNew(new RefTranlocal(Ref.this, value));
}
public Ref(Transaction t, final E value) {
((AlphaTransaction) t).attachNew(new RefTranlocal(Ref.this, value));
}
public E get() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) tx).privatize(Ref.this);
return tranlocalRef.get();
}
public E get(Transaction t) {
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) t).privatize(Ref.this);
return tranlocalRef.get();
}
@Override
public E getOrAwait() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) tx).privatize(Ref.this);
return tranlocalRef.getOrAwait();
}
public E getOrAwait(Transaction t) {
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) t).privatize(Ref.this);
return tranlocalRef.getOrAwait();
}
@Override
public E set(final E newRef) {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) tx).privatize(Ref.this);
return tranlocalRef.set(newRef);
}
public E set(Transaction t, final E newRef) {
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) t).privatize(Ref.this);
return tranlocalRef.set(newRef);
}
@Override
public boolean isNull() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) tx).privatize(Ref.this);
return tranlocalRef.isNull();
}
public boolean isNull(Transaction t) {
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) t).privatize(Ref.this);
return tranlocalRef.isNull();
}
@Override
public E clear() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) tx).privatize(Ref.this);
return tranlocalRef.clear();
}
public E clear(Transaction t) {
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) t).privatize(Ref.this);
return tranlocalRef.clear();
}
@Override
public String toString() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) tx).privatize(Ref.this);
return tranlocalRef.toString();
}
public String toString(Transaction t) {
RefTranlocal<E> tranlocalRef = (RefTranlocal) ((AlphaTransaction) t).privatize(Ref.this);
return tranlocalRef.toString();
}
@Override
public RefTranlocal<E> privatize(long readVersion) {
RefTranlocal<E> origin = (RefTranlocal<E>) load(readVersion);
if (origin == null) {
throw new LoadUncommittedException();
}
return new RefTranlocal<E>(origin);
}
}
class RefTranlocal<E> extends AlphaTranlocal {
//field belonging to the stm.
Ref atomicObject;
RefTranlocal origin;
E ref;
RefTranlocal(RefTranlocal<E> origin) {
this.version = origin.version;
this.atomicObject = origin.atomicObject;
this.ref = origin.ref;
this.origin = origin;
}
RefTranlocal(Ref<E> owner) {
this(owner, null);
}
RefTranlocal(Ref<E> owner, E ref) {
this.version = Long.MIN_VALUE;
this.atomicObject = owner;
this.ref = ref;
}
@Override
public AlphaAtomicObject getAtomicObject() {
return atomicObject;
}
public E clear() {
E oldValue = ref;
ref = null;
return oldValue;
}
public boolean isNull() {
return ref == null;
}
public E get() {
return ref;
}
public E set(E newValue) {
if (committed) {
throw new ReadonlyException();
}
E oldValue = ref;
this.ref = newValue;
return oldValue;
}
public E getOrAwait() {
if (isNull()) {
retry();
}
return ref;
}
@Override
public String toString() {
if (ref == null) {
return "Ref(reference=null)";
} else {
return format("Ref(reference=%s)", ref);
}
}
@Override
public void prepareForCommit(long writeVersion) {
this.version = writeVersion;
this.committed = true;
this.origin = null;
}
@Override
public AlphaTranlocalSnapshot takeSnapshot() {
return new RefTranlocalSnapshot<E>(this);
}
@Override
public DirtinessStatus getDirtinessStatus() {
if (committed) {
return DirtinessStatus.committed;
} else if (origin == null) {
return DirtinessStatus.fresh;
} else if (origin.ref != this.ref) {
return DirtinessStatus.dirty;
} else {
return DirtinessStatus.clean;
}
}
}
class RefTranlocalSnapshot<E> extends AlphaTranlocalSnapshot {
final RefTranlocal tranlocal;
final E value;
RefTranlocalSnapshot(RefTranlocal<E> tranlocal) {
this.tranlocal = tranlocal;
this.value = tranlocal.ref;
}
@Override
public AlphaTranlocal getTranlocal() {
return tranlocal;
}
@Override
public void restore() {
tranlocal.ref = value;
}
}

View file

@ -44,6 +44,15 @@
<option name="MAXIMUM_HEAP_SIZE" value="128" />
</component>
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
<component name="FacetAutodetectingManager">
<autodetection-disabled>
<facet-type id="web">
<modules>
<module name="akka-samples-lift" />
</modules>
</facet-type>
</autodetection-disabled>
</component>
<component name="IdProvider" IDEtalkID="2862596AA5228405A3DA5AD8DF61584A" />
<component name="InspectionProjectProfileManager">
<option name="PROJECT_PROFILE" value="Project Default" />
@ -55,11 +64,12 @@
<option name="myLocal" value="false" />
</profile>
</profiles>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="WARNING" />
<item index="1" class="java.lang.String" itemvalue="SERVER PROBLEM" />
<item index="2" class="java.lang.String" itemvalue="INFO" />
<item index="3" class="java.lang.String" itemvalue="ERROR" />
<list size="5">
<item index="0" class="java.lang.String" itemvalue="TYPO" />
<item index="1" class="java.lang.String" itemvalue="WARNING" />
<item index="2" class="java.lang.String" itemvalue="SERVER PROBLEM" />
<item index="3" class="java.lang.String" itemvalue="INFO" />
<item index="4" class="java.lang.String" itemvalue="ERROR" />
</list>
</component>
<component name="JavacSettings">
@ -231,6 +241,9 @@
<component name="ProjectDetails">
<option name="projectName" value="akka" />
</component>
<component name="ProjectDictionaryState">
<dictionary name="jboner" />
</component>
<component name="ProjectFileVersion" converted="true" />
<component name="ProjectKey">
<option name="state" value="project://default" />
@ -1360,39 +1373,6 @@
<root url="jar://$MAVEN_REPOSITORY$/net/liftweb/lift-actor/1.1-SNAPSHOT/lift-actor-1.1-SNAPSHOT-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.mortbay.jetty:jetty:7.0.0.pre5">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/jetty/7.0.0.pre5/jetty-7.0.0.pre5.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/jetty/7.0.0.pre5/jetty-7.0.0.pre5-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/jetty/7.0.0.pre5/jetty-7.0.0.pre5-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.mortbay.jetty:servlet-api:3.0.pre4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/servlet-api/3.0.pre4/servlet-api-3.0.pre4.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/servlet-api/3.0.pre4/servlet-api-3.0.pre4-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/servlet-api/3.0.pre4/servlet-api-3.0.pre4-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.mortbay.jetty:jetty-util:7.0.0.pre5">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/jetty-util/7.0.0.pre5/jetty-util-7.0.0.pre5.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/jetty-util/7.0.0.pre5/jetty-util-7.0.0.pre5-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mortbay/jetty/jetty-util/7.0.0.pre5/jetty-util-7.0.0.pre5-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.scala-tools.testing:scalatest:0.9.5">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/scala-tools/testing/scalatest/0.9.5/scalatest-0.9.5.jar!/" />

433
akka.iws
View file

@ -2,8 +2,16 @@
<project relativePaths="false" version="4">
<component name="ChangeListManager">
<list default="true" readonly="true" id="188c966f-a83c-4d3a-9128-54d5a2947a12" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
</list>
<ignored path=".idea/workspace.xml" />
<ignored path="akka.iws" />
@ -57,13 +65,91 @@
</component>
<component name="FileColors" enabled="false" enabledForTabs="false" />
<component name="FileEditorManager">
<leaf />
<leaf>
<file leaf-file-name="TransactionalState.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="241" column="0" selection-start="5934" selection-end="6105" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="STMBugReproducer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/STMBugReproducer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="6" selection-start="915" selection-end="915" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Ref.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/config/Ref.java">
<provider selected="true" editor-type-id="text-editor">
<state line="93" column="76" selection-start="3663" selection-end="3663" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="215" column="27" selection-start="7070" selection-end="7070" vertical-scroll-proportion="-14.769231">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="InMemoryActorSpec.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="211" column="6" selection-start="8234" selection-end="8234" vertical-scroll-proportion="0.26989618">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TransactionManagement.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="26" selection-start="1862" selection-end="1862" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Transaction.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="44" column="17" selection-start="1149" selection-end="1149" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindManager">
<FindUsagesManager>
<setting name="OPEN_NEW_TAB" value="false" />
</FindUsagesManager>
</component>
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/STMSpec.scala" />
<option value="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/config/Ref.java" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/STMBugReproducer.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
</list>
</option>
</component>
<component name="MavenImportPreferences">
<option name="importingSettings">
<MavenImportingSettings>
@ -104,7 +190,7 @@
<option name="STATE" value="0" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5">
<navigator currentView="PackagesPane" proportions="" version="1" splitterProportion="0.5">
<flattenPackages />
<showMembers />
<showModules />
@ -115,22 +201,128 @@
<autoscrollFromSource />
<sortByType />
</navigator>
<panes>
<pane id="Scope">
<subPane subId="Problems">
<PATH>
<PATH_ELEMENT USER_OBJECT="Root">
<option name="myItemId" value="" />
<option name="myItemType" value="" />
</PATH_ELEMENT>
<PATH_ELEMENT USER_OBJECT="akka-fun-test-java">
<option name="myItemId" value="" />
<option name="myItemType" value="" />
</PATH_ELEMENT>
<PATH_ELEMENT USER_OBJECT="akka-fun-test-java">
<option name="myItemId" value="" />
<option name="myItemType" value="" />
</PATH_ELEMENT>
<PATH_ELEMENT USER_OBJECT="src/test/java">
<option name="myItemId" value="" />
<option name="myItemType" value="" />
</PATH_ELEMENT>
<PATH_ELEMENT USER_OBJECT="se/scalablesolutions/akka/api">
<option name="myItemId" value="" />
<option name="myItemType" value="" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="ProjectPane">
<subPane />
</pane>
<pane id="PackagesPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Favorites" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="project.structure.proportion" value="0.0" />
<property name="project.structure.last.edited" value="Project" />
<property name="MemberChooser.copyJavadoc" value="false" />
<property name="GoToClass.includeLibraries" value="false" />
<property name="options.splitter.details.proportions" value="0.2" />
<property name="MemberChooser.showClasses" value="true" />
<property name="options.splitter.main.proportions" value="0.3" />
<property name="MemberChooser.sorted" value="false" />
<property name="options.searchVisible" value="true" />
<property name="GoToFile.includeJavaFiles" value="false" />
<property name="recentsLimit" value="5" />
<property name="GoToClass.includeLibraries" value="false" />
<property name="options.splitter.details.proportions" value="0.2" />
<property name="MemberChooser.showClasses" value="true" />
<property name="dynamic.classpath" value="false" />
<property name="project.structure.side.proportion" value="0.0" />
<property name="options.lastSelected" value="preferences.pluginManager" />
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
<property name="recentsLimit" value="5" />
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
</component>
<component name="RunManager" selected="ScalaTest.InMemoryActorSpec">
<component name="RunManager" selected="JUnit.InMemoryActorSpec">
<configuration default="false" name="InMemoryActorSpec.testVectorShouldRollbackStateForStatefulServerInCaseOfFailure" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.actor.*" />
<option name="ENABLED" value="true" />
</pattern>
<module name="akka-actors" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.actor.InMemoryActorSpec" />
<option name="METHOD_NAME" value="testVectorShouldRollbackStateForStatefulServerInCaseOfFailure" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="ADDITIONAL_CLASS_PATH" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="true" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="false" name="InMemoryActorSpec.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.actor.*" />
<option name="ENABLED" value="true" />
</pattern>
<module name="akka-actors" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.actor.InMemoryActorSpec" />
<option name="METHOD_NAME" value="testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="ADDITIONAL_CLASS_PATH" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="true" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="Remote" factoryName="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
@ -139,7 +331,12 @@
<option name="PORT" value="5005" />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="true" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="PhpRunConfigurationType" factoryName="PHP" browser="DEFAULT" web_path="">
<method>
<option name="AntTarget" enabled="false" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
@ -171,6 +368,37 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="TestNG" factoryName="TestNG" enabled="false" merge="false" runner="emma">
<module name="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="SUITE_NAME" />
<option name="PACKAGE_NAME" />
<option name="MAIN_CLASS_NAME" />
<option name="METHOD_NAME" />
<option name="GROUP_NAME" />
<option name="TEST_OBJECT" value="CLASS" />
<option name="VM_PARAMETERS" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" />
<option name="OUTPUT_DIRECTORY" />
<option name="ANNOTATION_TYPE" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="ADDITIONAL_CLASS_PATH" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<option name="PROPERTIES_FILE" />
<envs />
<properties />
<listeners />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="true" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false" runner="emma">
<module name="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
@ -225,12 +453,12 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="false" name="Unnamed" type="JUnit" factoryName="JUnit" enabled="false" merge="false" sample_coverage="true" runner="emma">
<configuration default="false" name="STMBugReproducer" type="JUnit" factoryName="JUnit" enabled="false" merge="false" sample_coverage="true" runner="emma">
<module name="akka-actors" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.actor.STMBugReproducer" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="" />
@ -243,18 +471,6 @@
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="true" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="false" name="InMemoryActorSpec" type="ScalaTestRunConfiguration" factoryName="ScalaTest">
<module name="akka-actors" />
<setting name="path" value="se.scalablesolutions.akka.actor.InMemoryActorSpec" />
<setting name="package" value="" />
<setting name="vmparams" value="" />
<setting name="params" value="" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method>
@ -263,9 +479,64 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="JUnit.Unnamed" />
<item index="1" class="java.lang.String" itemvalue="ScalaTest.InMemoryActorSpec" />
<configuration default="false" name="RemoteInMemoryStateTest" type="JUnit" factoryName="JUnit" enabled="false" merge="false" sample_coverage="true" runner="emma">
<module name="akka-fun-test-java" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="se.scalablesolutions.akka.api" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.RemoteInMemoryStateTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="ADDITIONAL_CLASS_PATH" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="false" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="false" name="InMemoryActorSpec" type="JUnit" factoryName="JUnit" enabled="false" merge="false" sample_coverage="true" runner="emma">
<module name="akka-actors" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.actor.InMemoryActorSpec" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="ADDITIONAL_CLASS_PATH" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="false" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<list size="5">
<item index="0" class="java.lang.String" itemvalue="JUnit.STMBugReproducer" />
<item index="1" class="java.lang.String" itemvalue="JUnit.RemoteInMemoryStateTest" />
<item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec" />
<item index="3" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec.testVectorShouldRollbackStateForStatefulServerInCaseOfFailure" />
<item index="4" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
</list>
<configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
<Host>localhost</Host>
@ -284,31 +555,53 @@
<option name="IGNORE_SPACES_IN_MERGE" value="false" />
<option name="DETECT_NESTED_COPIES" value="false" />
<option name="IGNORE_SPACES_IN_ANNOTATE" value="true" />
<option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true" />
<configuration useDefault="true">$PROJECT_DIR$/../../../.subversion</configuration>
<myIsUseDefaultProxy>false</myIsUseDefaultProxy>
<supportedVersion>125</supportedVersion>
</component>
<component name="TaskManager">
<option name="tasks">
<list>
<task id="Default" summary="Default task">
<option name="active" value="true" />
<option name="changeLists">
<list>
<ChangeListInfo id="188c966f-a83c-4d3a-9128-54d5a2947a12" name="Default" comment="" />
</list>
</option>
<option name="created" value="1252679070245" />
<option name="updated" value="1252772169806" />
</task>
</list>
</option>
</component>
<component name="ToolWindowManager">
<frame x="4" y="22" width="1436" height="878" extended-state="6" />
<editor active="false" />
<layout>
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.19264069" sideWeight="0.44770408" order="0" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24945927" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.5433673" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
</layout>
</component>
<component name="VcsManagerConfiguration">
@ -322,7 +615,9 @@
<option name="PERFORM_ROLLBACK_IN_BACKGROUND" value="false" />
<option name="FORCE_NON_EMPTY_COMMENT" value="false" />
<option name="LAST_COMMIT_MESSAGE" />
<option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
<option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" />
<option name="REFORMAT_BEFORE_FILE_COMMIT" value="false" />
<option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8" />
@ -341,9 +636,81 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="66" column="0" selection-start="2434" selection-end="2434" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="294" column="7" selection-start="13343" selection-end="13343" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java">
<provider selected="true" editor-type-id="text-editor">
<state line="11" column="0" selection-start="376" selection-end="448" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/config/Ref.java">
<provider selected="true" editor-type-id="text-editor">
<state line="93" column="76" selection-start="3663" selection-end="3663" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/main/scala/MongoStorage.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/STMBugReproducer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="6" selection-start="915" selection-end="915" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/ActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="21" selection-start="0" selection-end="1485" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="73" column="37" selection-start="2679" selection-end="2679" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="241" column="0" selection-start="5934" selection-end="6105" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="26" selection-start="1862" selection-end="1862" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="29" column="20" selection-start="737" selection-end="737" vertical-scroll-proportion="0.33333334">
<state line="44" column="17" selection-start="1149" selection-end="1149" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="215" column="27" selection-start="7070" selection-end="7070" vertical-scroll-proportion="-14.769231">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="211" column="6" selection-start="8234" selection-end="8234" vertical-scroll-proportion="0.26989618">
<folding />
</state>
</provider>