[jbosscache-commits] JBoss Cache SVN: r6335 - in core/trunk/src/main/java/org/jboss/cache: mvcc and 1 other directory.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Fri Jul 18 11:47:42 EDT 2008


Author: manik.surtani at jboss.com
Date: 2008-07-18 11:47:42 -0400 (Fri, 18 Jul 2008)
New Revision: 6335

Modified:
   core/trunk/src/main/java/org/jboss/cache/PessimisticUnversionedNode.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java
Log:
Further enhancements

Modified: core/trunk/src/main/java/org/jboss/cache/PessimisticUnversionedNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/PessimisticUnversionedNode.java	2008-07-18 15:03:00 UTC (rev 6334)
+++ core/trunk/src/main/java/org/jboss/cache/PessimisticUnversionedNode.java	2008-07-18 15:47:42 UTC (rev 6335)
@@ -71,6 +71,15 @@
       return sb.toString();
    }
 
+   @SuppressWarnings("unchecked")
+   @Override
+   public InternalNode<K, V> copy()
+   {
+      PessimisticUnversionedNode<K, V> n = new PessimisticUnversionedNode<K, V>(fqn.getLastElement(), fqn, data, cache);
+      copyInternals(n);
+      return n;
+   }
+
    // ------ legacy addChild methods that used a lot of implicit locks.
 
    @Override

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java	2008-07-18 15:03:00 UTC (rev 6334)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java	2008-07-18 15:47:42 UTC (rev 6335)
@@ -10,6 +10,7 @@
 import org.jboss.cache.NodeSPI;
 import org.jboss.cache.invocation.InvocationContext;
 import org.jboss.cache.invocation.NodeInvocationDelegate;
+import static org.jboss.cache.mvcc.ReadCommittedNode.Flags.*;
 
 /**
  * A node delegate that encapsulates read committed semantics when writes are initiated, committed or rolled back.
@@ -23,15 +24,55 @@
    private static final boolean trace = log.isTraceEnabled();
 
    protected volatile InternalNode backup;
-   protected boolean changed;
-   protected boolean created;
-   protected boolean deleted;
+   protected byte flags = 0;
 
+   protected static enum Flags
+   {
+      CHANGED(0x1), CREATED(0x2), DELETED(0x4);
+      final byte mask;
+
+      Flags(int mask)
+      {
+         this.mask = (byte) mask;
+      }
+   }
+
    public ReadCommittedNode(InternalNode node)
    {
       super(node);
    }
 
+   /**
+    * Tests whether a flag is set.
+    *
+    * @param flag flag to test
+    * @return true if set, false otherwise.
+    */
+   protected final boolean isFlagSet(Flags flag)
+   {
+      return (flags & flag.mask) != 0;
+   }
+
+   /**
+    * Unility method that sets the value of the given flag to true.
+    *
+    * @param flag flag to set
+    */
+   protected final void setFlag(Flags flag)
+   {
+      flags |= flag.mask;
+   }
+
+   /**
+    * Utility method that sets the value of the flag to false.
+    *
+    * @param flag flag to unset
+    */
+   protected final void unsetFlag(Flags flag)
+   {
+      flags ^= flag.mask;
+   }
+
    public boolean isNullNode()
    {
       return false;
@@ -48,10 +89,10 @@
     */
    public void markForUpdate(InvocationContext ctx, DataContainer container, NodeFactory nodeFactory, boolean writeSkewCheck)
    {
-      if (changed) return; // already copied
+      if (isFlagSet(CHANGED)) return; // already copied
 
-      changed = true;
-      if (!created)
+      setFlag(CHANGED);
+      if (!isFlagSet(CREATED))
       {
          backup = node;
          InternalNode backupDelegationTarget = ((NodeReference) backup).getDelegate();
@@ -68,14 +109,14 @@
     */
    public void commitUpdate(InvocationContext ctx, DataContainer container, NodeFactory nodeFactory)
    {
-      if (changed)
+      if (isFlagSet(CHANGED))
       {
          Fqn fqn = getFqn();
          if (trace)
-            log.trace("Updating node [" + fqn + "].  deleted=" + isDeleted() + " valid=" + isValid() + " changed=" + isChanged() + " created=" + created);
+            log.trace("Updating node [" + fqn + "].  deleted=" + isDeleted() + " valid=" + isValid() + " changed=" + isChanged() + " created=" + isFlagSet(CREATED));
 
          // check if node has been deleted.
-         if (deleted)
+         if (isFlagSet(DELETED))
          {
             if (!fqn.isRoot())
             {
@@ -89,7 +130,7 @@
                log.warn("Attempting to remove the root node.  Not doing anything!");
             }
          }
-         else if (created)
+         else if (isFlagSet(CREATED))
          {
             // add newly created nodes to parents.
             NodeSPI parent = lookupParent(fqn, ctx, container);
@@ -107,9 +148,7 @@
    private void reset()
    {
       backup = null;
-      changed = false;
-      created = false;
-      deleted = false;
+      flags = 0;
    }
 
    /**
@@ -143,15 +182,14 @@
    protected void updateNode(InvocationContext ctx, DataContainer dataContainer, NodeFactory nf)
    {
       // swap refs
-      if (!created) ((NodeReference) backup).setDelegate(node);
+      if (!isFlagSet(CREATED)) ((NodeReference) backup).setDelegate(node);
       node = backup;
    }
 
    public void rollbackUpdate()
    {
       node = backup;
-      backup = null;
-      changed = false;
+      reset();
    }
 
    /**
@@ -159,7 +197,7 @@
     */
    public boolean isChanged()
    {
-      return changed;
+      return isFlagSet(CHANGED);
    }
 
    /**
@@ -167,12 +205,15 @@
     */
    public boolean isCreated()
    {
-      return created;
+      return isFlagSet(CREATED);
    }
 
    public void setCreated(boolean created)
    {
-      this.created = created;
+      if (created)
+         setFlag(CREATED);
+      else
+         unsetFlag(CREATED);
    }
 
    // do not propagate deletion flags to the underlying node.
@@ -180,13 +221,16 @@
    @Override
    public boolean isDeleted()
    {
-      return deleted;
+      return isFlagSet(DELETED);
    }
 
    @Override
    public void markAsDeleted(boolean deleted)
    {
-      this.deleted = deleted;
+      if (deleted)
+         setFlag(DELETED);
+      else
+         unsetFlag(DELETED);
    }
 
    @Override

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java	2008-07-18 15:03:00 UTC (rev 6334)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java	2008-07-18 15:47:42 UTC (rev 6335)
@@ -9,6 +9,8 @@
 import org.jboss.cache.NodeSPI;
 import org.jboss.cache.invocation.InvocationContext;
 import org.jboss.cache.invocation.NodeInvocationDelegate;
+import static org.jboss.cache.mvcc.ReadCommittedNode.Flags.CHANGED;
+import static org.jboss.cache.mvcc.ReadCommittedNode.Flags.DELETED;
 import org.jboss.cache.optimistic.DataVersioningException;
 
 /**
@@ -29,12 +31,12 @@
    @Override
    public void markForUpdate(InvocationContext ctx, DataContainer container, NodeFactory nodeFactory, boolean writeSkewCheck)
    {
-      if (changed) return; // already copied
+      if (isFlagSet(CHANGED)) return; // already copied
 
       Fqn fqn = getFqn();
 
       // mark node as changed.
-      changed = true;
+      setFlag(CHANGED);
 
       if (writeSkewCheck)
       {
@@ -61,7 +63,7 @@
       {
          dataContainer.setRoot(nf.createNodeInvocationDelegate(node, false));
       }
-      else if (!deleted)
+      else if (!isFlagSet(DELETED))
       {
          NodeSPI parent = lookupParent(getFqn(), ctx, dataContainer);
          parent.addChildDirect(nf.createNodeInvocationDelegate(node, false));




More information about the jbosscache-commits mailing list