[jbosscache-commits] JBoss Cache SVN: r6328 - in core/branches/2.2.X/src/main/java/org/jboss/cache: optimistic and 1 other directory.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Fri Jul 18 08:35:11 EDT 2008


Author: manik.surtani at jboss.com
Date: 2008-07-18 08:35:11 -0400 (Fri, 18 Jul 2008)
New Revision: 6328

Modified:
   core/branches/2.2.X/src/main/java/org/jboss/cache/AbstractNode.java
   core/branches/2.2.X/src/main/java/org/jboss/cache/UnversionedNode.java
   core/branches/2.2.X/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java
Log:
Maintaining our own bit encoding is more efficient than an EnumSet

Modified: core/branches/2.2.X/src/main/java/org/jboss/cache/AbstractNode.java
===================================================================
--- core/branches/2.2.X/src/main/java/org/jboss/cache/AbstractNode.java	2008-07-18 10:27:10 UTC (rev 6327)
+++ core/branches/2.2.X/src/main/java/org/jboss/cache/AbstractNode.java	2008-07-18 12:35:11 UTC (rev 6328)
@@ -6,7 +6,6 @@
 import static org.jboss.cache.AbstractNode.NodeFlags.DELETED;
 import static org.jboss.cache.AbstractNode.NodeFlags.RESIDENT;
 
-import java.util.EnumSet;
 import java.util.Map;
 
 /**
@@ -21,63 +20,117 @@
    /**
     * Flags placed on the node.  Replaces older 'boolean' flags.
     */
-   protected final EnumSet<NodeFlags> flags = EnumSet.noneOf(NodeFlags.class);
+   // NOTE: this is a lot more efficient than an EnumSet, expecially when initialising and copying.
+   protected short flags = 0;
 
    /**
     * These flags were originally stored as booleans on the UnversionedNode class.  They have been replaced with an enum
     * and an EnumSet, which is much more space-efficient for very little cost in lookups.
     */
-   public enum NodeFlags
+   public static enum NodeFlags
    {
       /**
        * All children are loaded from the cache loader if this flag is present.
        */
-      CHILDREN_LOADED,
+      CHILDREN_LOADED(0x1),
       /**
        * Data is loaded from the cache loader if this flag is present.
        */
-      DATA_LOADED,
+      DATA_LOADED(0x2),
       /**
        * Node is write-locked when children are added or removed if this flag is enabled.
        */
-      LOCK_FOR_CHILD_INSERT_REMOVE,
+      LOCK_FOR_CHILD_INSERT_REMOVE(0x4),
       /**
        * Node is valid if this flag is present.
        */
-      VALID,
+      VALID(0x8),
       /**
        * Node has been deleted.
        */
-      DELETED,
+      DELETED(0x10),
       /**
        * NOde is resident and excluded from evictions
        */
-      RESIDENT,
+      RESIDENT(0x20),
       /**
        * Specific to Optimistic Locking Workspace nodes - set if a node has been modified in a workspace.
        */
-      MODIFIED_IN_WORKSPACE,
+      MODIFIED_IN_WORKSPACE(0x40),
       /**
        * Specific to Optimistic Locking Workspace nodes - set if a node has been created in a workspace.
        */
-      CREATED_IN_WORKSPACE,
+      CREATED_IN_WORKSPACE(0x80),
       /**
        * Specific to Optimistic Locking Workspace nodes - set if a node has added or removed children in a workspace.
        */
-      CHILDREN_MODIFIED_IN_WORKSPACE,
+      CHILDREN_MODIFIED_IN_WORKSPACE(0x100),
       /**
        * Specific to Optimistic Locking Workspace nodes - set if an implicit version is associated with this node.
        */
-      VERSIONING_IMPLICIT,
+      VERSIONING_IMPLICIT(0x200),
       /**
        * Specific to Optimistic Locking Workspace nodes - set if a node has been resurrected in a workspace.
        */
-      RESURRECTED_IN_WORKSPACE
+      RESURRECTED_IN_WORKSPACE(0x400);
+
+      protected final short mask;
+
+      NodeFlags(int mask)
+      {
+         this.mask = (short) mask;
+      }
    }
 
+   /**
+    * Tests whether a flag is set.
+    *
+    * @param flag flag to test
+    * @return true if set, false otherwise.
+    */
+   protected final boolean isFlagSet(NodeFlags flag)
+   {
+      return (flags & flag.mask) != 0;
+   }
+
+   /**
+    * Utility method for setting or unsetting a flag.  If status is true, the NodeFlag specified is added to the {@link #flags}
+    * encoded short.  If status is false, the NodeFlag is removed from the encoded short.
+    *
+    * @param flag  flag to set or unset
+    * @param value true to set the flag, false to unset the flag.
+    */
+   protected final void setFlag(NodeFlags flag, boolean value)
+   {
+      if (value)
+         setFlag(flag);
+      else
+         unsetFlag(flag);
+   }
+
+   /**
+    * Unility method that sets the value of the given flag to true.
+    *
+    * @param flag flag to set
+    */
+   protected final void setFlag(NodeFlags flag)
+   {
+      flags |= flag.mask;
+   }
+
+   /**
+    * Utility method that sets the value of the flag to false.
+    *
+    * @param flag flag to unset
+    */
+   protected final void unsetFlag(NodeFlags flag)
+   {
+      flags ^= flag.mask;
+   }
+
    public boolean isDeleted()
    {
-      return flags.contains(DELETED);
+      return isFlagSet(DELETED);
    }
 
    public void markAsDeleted(boolean marker)
@@ -109,7 +162,7 @@
 
    public boolean isResident()
    {
-      return flags.contains(RESIDENT);
+      return isFlagSet(RESIDENT);
    }
 
    @Override
@@ -128,19 +181,4 @@
    {
       return fqn.hashCode();
    }
-
-   /**
-    * Utility method for setting or unsetting a flag.  If status is true, the NodeFlag specified is added to the {@link #flags}
-    * EnumSet.  If status is false, the NodeFlag is removed from the EnumSet.
-    *
-    * @param flag   flag to set or unset
-    * @param status true to set the flag, false to unset the flag.
-    */
-   protected void setFlag(NodeFlags flag, boolean status)
-   {
-      if (status)
-         flags.add(flag);
-      else
-         flags.remove(flag);
-   }
 }

Modified: core/branches/2.2.X/src/main/java/org/jboss/cache/UnversionedNode.java
===================================================================
--- core/branches/2.2.X/src/main/java/org/jboss/cache/UnversionedNode.java	2008-07-18 10:27:10 UTC (rev 6327)
+++ core/branches/2.2.X/src/main/java/org/jboss/cache/UnversionedNode.java	2008-07-18 12:35:11 UTC (rev 6328)
@@ -101,8 +101,8 @@
     */
    protected void initFlags()
    {
-      flags.add(DATA_LOADED);
-      flags.add(VALID);
+      setFlag(DATA_LOADED);
+      setFlag(VALID);
    }
 
    public NodeSPI getDelegate()
@@ -176,7 +176,7 @@
 
    public boolean isChildrenLoaded()
    {
-      return flags.contains(CHILDREN_LOADED);
+      return isFlagSet(CHILDREN_LOADED);
    }
 
    public void setChildrenLoaded(boolean childrenLoaded)
@@ -685,7 +685,7 @@
     */
    public boolean isDataLoaded()
    {
-      return flags.contains(DATA_LOADED);
+      return isFlagSet(DATA_LOADED);
    }
 
    /**
@@ -698,7 +698,7 @@
 
    public boolean isValid()
    {
-      return flags.contains(VALID);
+      return isFlagSet(VALID);
    }
 
    public void setValid(boolean valid, boolean recursive)
@@ -717,7 +717,7 @@
 
    public boolean isLockForChildInsertRemove()
    {
-      return flags.contains(LOCK_FOR_CHILD_INSERT_REMOVE);
+      return isFlagSet(LOCK_FOR_CHILD_INSERT_REMOVE);
    }
 
    public void setLockForChildInsertRemove(boolean lockForChildInsertRemove)

Modified: core/branches/2.2.X/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java
===================================================================
--- core/branches/2.2.X/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java	2008-07-18 10:27:10 UTC (rev 6327)
+++ core/branches/2.2.X/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java	2008-07-18 12:35:11 UTC (rev 6328)
@@ -72,7 +72,7 @@
 
    protected void initFlags()
    {
-      flags.add(VERSIONING_IMPLICIT);
+      setFlag(VERSIONING_IMPLICIT);
    }
 
    protected Set<Fqn> getChildrenAddedSet()
@@ -89,7 +89,7 @@
 
    public boolean isChildrenModified()
    {
-      return flags.contains(CHILDREN_MODIFIED_IN_WORKSPACE);
+      return isFlagSet(CHILDREN_MODIFIED_IN_WORKSPACE);
    }
 
    public boolean isChildrenLoaded()
@@ -99,7 +99,7 @@
 
    public boolean isResurrected()
    {
-      return flags.contains(RESURRECTED_IN_WORKSPACE);
+      return isFlagSet(RESURRECTED_IN_WORKSPACE);
    }
 
    public void markAsResurrected(boolean resurrected)
@@ -123,7 +123,7 @@
     */
    public boolean isModified()
    {
-      return flags.contains(MODIFIED_IN_WORKSPACE);
+      return isFlagSet(MODIFIED_IN_WORKSPACE);
    }
 
    /**
@@ -144,7 +144,7 @@
    public void putAll(Map<K, V> data)
    {
       realPut(data, false);
-      setFlag(MODIFIED_IN_WORKSPACE, true);
+      setFlag(MODIFIED_IN_WORKSPACE);
    }
 
    public void replaceAll(Map<K, V> data)
@@ -155,7 +155,7 @@
 
    public V put(K key, V value)
    {
-      setFlag(MODIFIED_IN_WORKSPACE, true);
+      setFlag(MODIFIED_IN_WORKSPACE);
       if (optimisticDataMap == null) optimisticDataMap = new HashMap<K, V>();
       return optimisticDataMap.put(key, value);
 
@@ -163,7 +163,7 @@
 
    public V remove(K key)
    {
-      setFlag(MODIFIED_IN_WORKSPACE, true);
+      setFlag(MODIFIED_IN_WORKSPACE);
       if (optimisticDataMap == null) return null;
       return optimisticDataMap.remove(key);
 
@@ -211,7 +211,7 @@
 
    private void realPut(Map<K, V> data, boolean eraseData, boolean forceDirtyFlag)
    {
-      if (forceDirtyFlag) setFlag(MODIFIED_IN_WORKSPACE, true);
+      if (forceDirtyFlag) setFlag(MODIFIED_IN_WORKSPACE);
       if (eraseData && optimisticDataMap != null)
       {
          optimisticDataMap.clear();
@@ -240,13 +240,13 @@
       NodeSPI<K, V> child = (NodeSPI<K, V>) factory.createNodeOfType(parent, child_name, parent, null);
       getChildrenAddedSet().add(child.getFqn());
       if (childrenRemoved != null) childrenRemoved.remove(child.getFqn());
-      setFlag(CHILDREN_MODIFIED_IN_WORKSPACE, true);
+      setFlag(CHILDREN_MODIFIED_IN_WORKSPACE);
       return child;
    }
 
    public boolean isVersioningImplicit()
    {
-      return flags.contains(VERSIONING_IMPLICIT);
+      return isFlagSet(VERSIONING_IMPLICIT);
    }
 
    public void setVersioningImplicit(boolean versioningImplicit)
@@ -307,12 +307,12 @@
 
    public boolean isCreated()
    {
-      return flags.contains(CREATED_IN_WORKSPACE);
+      return isFlagSet(CREATED_IN_WORKSPACE);
    }
 
    public void markAsCreated()
    {
-      setFlag(CREATED_IN_WORKSPACE, true);
+      setFlag(CREATED_IN_WORKSPACE);
       // created != modified!!!
    }
 
@@ -387,7 +387,7 @@
       if (optimisticDataMap != null)
       {
          optimisticDataMap.clear();
-         setFlag(MODIFIED_IN_WORKSPACE, true);
+         setFlag(MODIFIED_IN_WORKSPACE);
       }
    }
 
@@ -475,7 +475,7 @@
       {*/
       getChildrenRemovedSet().add(childFqn);
       if (childrenAdded != null) childrenAdded.remove(childFqn);
-      setFlag(CHILDREN_MODIFIED_IN_WORKSPACE, true);
+      setFlag(CHILDREN_MODIFIED_IN_WORKSPACE);
       return node.getChildDirect(childName) != null;
       /*}
       else




More information about the jbosscache-commits mailing list