[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