[jboss-svn-commits] JBL Code SVN: r37212 - in labs/jbosstm/workspace/mlittle/STM-Arjuna/src: main/java/org/jboss/stm/annotations and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jul 3 06:27:56 EDT 2011
Author: mark.little at jboss.com
Date: 2011-07-03 06:27:56 -0400 (Sun, 03 Jul 2011)
New Revision: 37212
Modified:
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/PersistentContainer.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/RecoverableContainer.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/RestoreState.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/SaveState.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/Transactional.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/proxy/LockManagerProxy.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/reflect/InvocationHandler.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/ComparisonUnitTest.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/LinkedListUnitTest.java
labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/PersistentContainerUnitTest.java
Log:
Added LinkedList test and fixed bug in not defaulting to WriteLock if no lock set.
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/PersistentContainer.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/PersistentContainer.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/PersistentContainer.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -59,7 +59,7 @@
public synchronized T enlist (T member)
{
- return super.create(member, ObjectType.ANDPERSISTENT);
+ return super.createHandle(member, ObjectType.ANDPERSISTENT);
}
@SuppressWarnings(value={"unchecked"})
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/RecoverableContainer.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/RecoverableContainer.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/RecoverableContainer.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -76,7 +76,7 @@
public synchronized T enlist (T member)
{
- return create(member, ObjectType.RECOVERABLE);
+ return createHandle(member, ObjectType.RECOVERABLE);
}
/**
@@ -85,7 +85,7 @@
*/
@SuppressWarnings(value={"unchecked"})
- protected synchronized T create (T member, int ot)
+ protected synchronized T createHandle (T member, int ot)
{
/*
* Everything that is transactional needs to be explicitly marked as such in
@@ -121,7 +121,7 @@
*/
@SuppressWarnings("unchecked")
- public synchronized T getMember (Uid reference)
+ public synchronized T getHandle (Uid reference)
{
if (reference == null)
throw new IllegalArgumentException();
@@ -156,7 +156,7 @@
*/
@SuppressWarnings(value={"unchecked"})
- public Uid getUidForInstance (T member)
+ public Uid getUidForOriginal (T member)
{
T proxy = _transactionalProxies.get(member);
@@ -183,10 +183,8 @@
*/
@SuppressWarnings(value={"unchecked"})
- public Uid getUidForProxy (T proxy)
+ public Uid getUidForHandle (T proxy)
{
- System.err.println("**getting Uid");
-
try
{
InvocationHandler<T> handler = (InvocationHandler<T>) Proxy.getInvocationHandler(proxy);
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/RestoreState.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/RestoreState.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/RestoreState.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -25,7 +25,7 @@
/**
* Used to define the specific restore_state method for the class. This
- * is used in preference to any @DurableState indications on the class
+ * is used in preference to any @State indications on the class
* state.
*
* @author marklittle
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/SaveState.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/SaveState.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/SaveState.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -25,7 +25,7 @@
/**
* Used to define the specific save_state method for the class. This
- * is used in preference to any @DurableState indications on the class
+ * is used in preference to any @State indications on the class
* state. This is the case no matter where in the class hierarchy it
* occurs. So if you have a base class that uses save/restore methods the
* inherited classes must have them too if their state is to be durable.
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/Transactional.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/Transactional.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/annotations/Transactional.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -28,7 +28,7 @@
* container. Unless specified using other annotations, all public
* methods will be assumed to modify the state of the object, i.e.,
* require write locks. The only state that will be saved/restored is that
- * which is marked using the DurableState annotation or SaveState/RestoreState.
+ * which is marked using the @State annotation or SaveState/RestoreState.
*
* This assumes currently that all state modification and locking occurs through
* public methods. This means that even if there are private, protected or
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/proxy/LockManagerProxy.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/proxy/LockManagerProxy.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/proxy/LockManagerProxy.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -95,7 +95,7 @@
{
for (Field afield : fields)
{
- // ignore if not flagged with @DurableState
+ // ignore if not flagged with @State
if (afield.isAnnotationPresent(State.class))
_fields.add(afield);
@@ -111,7 +111,7 @@
{
Field afield = _fields.get(i);
- // ignore if not flagged with @DurableState
+ // ignore if not flagged with @State
if (afield.isAnnotationPresent(State.class))
{
@@ -170,7 +170,7 @@
{
for (Field afield : fields)
{
- // ignore if not flagged with DurableState
+ // ignore if not flagged with @State
if (afield.isAnnotationPresent(State.class))
_fields.add(afield);
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/reflect/InvocationHandler.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/reflect/InvocationHandler.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/main/java/org/jboss/stm/internal/reflect/InvocationHandler.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -28,6 +28,7 @@
import org.jboss.stm.LockException;
import org.jboss.stm.RecoverableContainer;
import org.jboss.stm.TransactionException;
+import org.jboss.stm.annotations.LockFree;
import org.jboss.stm.annotations.Nested;
import org.jboss.stm.annotations.ReadLock;
import org.jboss.stm.annotations.WriteLock;
@@ -56,7 +57,7 @@
public InvocationHandler (RecoverableContainer<T> c, T obj, Uid u)
{
- this(c, obj, ObjectType.ANDPERSISTENT, u); // ot not strictly needed
+ this(c, obj, ObjectType.ANDPERSISTENT, u);
}
@SuppressWarnings(value={"unchecked"})
@@ -113,7 +114,7 @@
}
public Object invoke (Object proxy, java.lang.reflect.Method method, Object[] args) throws Throwable
- {
+ {
/*
* Do nothing currently if not inside of a transaction and
* not asked to create transactions for this type of object.
@@ -146,6 +147,7 @@
*/
Integer lockType = _cachedMethods.get(method);
+ boolean lockFree = false;
if (lockType == null)
{
@@ -170,13 +172,27 @@
{
if (theMethod.isAnnotationPresent(WriteLock.class))
lockType = new Integer(LockMode.WRITE);
+ else
+ {
+ if (theMethod.isAnnotationPresent(LockFree.class))
+ lockFree = true;
+ }
}
+ if ((lockType == null) && (!lockFree)) // default to WRITE
+ lockType = new Integer(LockMode.WRITE);
+
_cachedMethods.put(method, lockType);
}
// TODO type specific concurrency control (define Lock class in annotation?)
+ if (_txObject == null)
+ throw new LockException("Transactional object is null!");
+
+ if (lockType == null)
+ throw new LockException("Lock type is null!");
+
if (_txObject.setlock(new Lock(lockType.intValue()), 0) != LockResult.GRANTED)
{
throw new LockException("Could not set "+LockMode.stringForm(lockType.intValue())+" lock.");
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/ComparisonUnitTest.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/ComparisonUnitTest.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/ComparisonUnitTest.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -24,9 +24,9 @@
import java.io.IOException;
+import org.jboss.stm.annotations.State;
import org.jboss.stm.annotations.Transactional;
import org.jboss.stm.annotations.ReadLock;
-import org.jboss.stm.annotations.DurableState;
import org.jboss.stm.annotations.WriteLock;
import com.arjuna.ats.arjuna.AtomicAction;
@@ -220,7 +220,7 @@
state += value;
}
- @DurableState
+ @State
private int state;
}
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/LinkedListUnitTest.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/LinkedListUnitTest.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/LinkedListUnitTest.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -27,9 +27,9 @@
import org.jboss.stm.annotations.RestoreState;
import org.jboss.stm.annotations.SaveState;
+import org.jboss.stm.annotations.State;
import org.jboss.stm.annotations.Transactional;
import org.jboss.stm.annotations.ReadLock;
-import org.jboss.stm.annotations.DurableState;
import org.jboss.stm.annotations.WriteLock;
import com.arjuna.ats.arjuna.AtomicAction;
@@ -54,6 +54,7 @@
public class LinkedListUnitTest extends TestCase
{
+ @Transactional
public interface Node
{
public void setPrev (Node p);
@@ -61,11 +62,18 @@
public void setNext (Node n);
public Node getNext ();
+
+ public String nodeName ();
}
@Transactional
public class NodeImple implements Node
{
+ public NodeImple (String name)
+ {
+ _nodeName = name;
+ }
+
@Override
public Node getNext ()
{
@@ -88,13 +96,31 @@
public void setPrev (Node p)
{
_prev = p;
- }
+ }
+
+ public String nodeName ()
+ {
+ return _nodeName;
+ }
@SaveState
public void save_state (OutputObjectState os) throws IOException
{
- theContainer.getId(_prev).pack(os);
- theContainer.getId(_next).pack(os);
+ if (_prev == null)
+ os.packBoolean(false);
+ else
+ {
+ os.packBoolean(true);
+ theContainer.getUidForHandle(_prev).pack(os);
+ }
+
+ if (_next == null)
+ os.packBoolean(false);
+ else
+ {
+ os.packBoolean(true);
+ theContainer.getUidForHandle(_next).pack(os);
+ }
os.packString(_nodeName);
}
@@ -103,31 +129,67 @@
public void restore_state (InputObjectState os) throws IOException
{
Uid id = new Uid(Uid.nullUid());
+ boolean ptr = os.unpackBoolean();
- id.unpack(os);
+ if (ptr == false)
+ _prev = null;
+ else
+ {
+ id.unpack(os);
+ _prev = theContainer.getHandle(id);
+ }
+
+ ptr = os.unpackBoolean();
- _prev = theContainer.recreate(id);
-
- id.unpack(os);
-
- _next = theContainer.recreate(id);
+ if (ptr == false)
+ _next = null;
+ else
+ {
+ id.unpack(os);
+ _next = theContainer.getHandle(id);
+ }
_nodeName = os.unpackString();
}
- @DurableState
+ @State
private Node _prev;
- @DurableState
+ @State
private Node _next;
- @DurableState
+ @State
private String _nodeName = "";
}
- public void testExampleSTM () throws Exception
+ public void testLinkedList () throws Exception
{
+ NodeImple ni1 = new NodeImple("one");
+ NodeImple ni2 = new NodeImple("two");
+ NodeImple ni3 = new NodeImple("three");
+ AtomicAction A = new AtomicAction();
+ Node h1 = theContainer.enlist(ni1);
+ Node h2 = theContainer.enlist(ni2);
+ Node h3 = theContainer.enlist(ni3);
+
+ h1.setNext(h2);
+ h2.setPrev(h1);
+
+ assertEquals(h1.getPrev(), null);
+ assertEquals(h2.getPrev().nodeName(), h1.nodeName());
+
+ A.begin();
+
+ h1.setNext(h3);
+ h2.setPrev(null);
+ h3.setPrev(h1);
+
+ A.abort();
+
+ assertEquals(h1.getNext().nodeName(), h2.nodeName());
+ assertEquals(h1.getPrev(), null);
+ assertEquals(h2.getPrev().nodeName(), h1.nodeName());
}
public RecoverableContainer<Node> theContainer = new RecoverableContainer<Node>();
Modified: labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/PersistentContainerUnitTest.java
===================================================================
--- labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/PersistentContainerUnitTest.java 2011-07-02 16:40:53 UTC (rev 37211)
+++ labs/jbosstm/workspace/mlittle/STM-Arjuna/src/test/java/org/jboss/stm/PersistentContainerUnitTest.java 2011-07-03 10:27:56 UTC (rev 37212)
@@ -158,7 +158,7 @@
try
{
Sample proxy = theContainer.enlist(tester);
- Uid u = theContainer.getUidForInstance(proxy);
+ Uid u = theContainer.getUidForOriginal(proxy);
assertNotNull(u);
}
More information about the jboss-svn-commits
mailing list