[jbosscache-commits] JBoss Cache SVN: r6329 - in core/trunk/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:36:52 EDT 2008


Author: manik.surtani at jboss.com
Date: 2008-07-18 08:36:52 -0400 (Fri, 18 Jul 2008)
New Revision: 6329

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

Modified: core/trunk/src/main/java/org/jboss/cache/AbstractNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/AbstractNode.java	2008-07-18 12:35:11 UTC (rev 6328)
+++ core/trunk/src/main/java/org/jboss/cache/AbstractNode.java	2008-07-18 12:36:52 UTC (rev 6329)
@@ -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.concurrent.ConcurrentMap;
 
 /**
@@ -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/trunk/src/main/java/org/jboss/cache/UnversionedNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/UnversionedNode.java	2008-07-18 12:35:11 UTC (rev 6328)
+++ core/trunk/src/main/java/org/jboss/cache/UnversionedNode.java	2008-07-18 12:36:52 UTC (rev 6329)
@@ -117,8 +117,8 @@
     */
    protected void initFlags()
    {
-      flags.add(DATA_LOADED);
-      flags.add(VALID);
+      setFlag(DATA_LOADED);
+      setFlag(VALID);
    }
 
    public NodeSPI<K, V> getDelegate()
@@ -183,7 +183,7 @@
 
    public boolean isChildrenLoaded()
    {
-      return flags.contains(CHILDREN_LOADED);
+      return isFlagSet(CHILDREN_LOADED);
    }
 
    public void setChildrenLoaded(boolean childrenLoaded)
@@ -669,7 +669,7 @@
     */
    public boolean isDataLoaded()
    {
-      return flags.contains(DATA_LOADED);
+      return isFlagSet(DATA_LOADED);
    }
 
    /**
@@ -682,7 +682,7 @@
 
    public boolean isValid()
    {
-      return flags.contains(VALID);
+      return isFlagSet(VALID);
    }
 
    public void setValid(boolean valid, boolean recursive)
@@ -701,7 +701,7 @@
 
    public boolean isLockForChildInsertRemove()
    {
-      return flags.contains(LOCK_FOR_CHILD_INSERT_REMOVE);
+      return isFlagSet(LOCK_FOR_CHILD_INSERT_REMOVE);
    }
 
    public void setLockForChildInsertRemove(boolean lockForChildInsertRemove)
@@ -723,8 +723,7 @@
       n.commandsFactory = commandsFactory;
       n.delegate = delegate;
       n.nodeFactory = nodeFactory;
-      n.flags.clear();
-      n.flags.addAll(flags);
+      n.flags = flags;
       n.lockStrategyFactory = lockStrategyFactory;
    }
 

Modified: core/trunk/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java	2008-07-18 12:35:11 UTC (rev 6328)
+++ core/trunk/src/main/java/org/jboss/cache/optimistic/WorkspaceNodeImpl.java	2008-07-18 12:36:52 UTC (rev 6329)
@@ -74,7 +74,7 @@
 
    protected void initFlags()
    {
-      flags.add(VERSIONING_IMPLICIT);
+      setFlag(VERSIONING_IMPLICIT);
    }
 
    protected Set<Fqn> getChildrenAddedSet()
@@ -91,7 +91,7 @@
 
    public boolean isChildrenModified()
    {
-      return flags.contains(CHILDREN_MODIFIED_IN_WORKSPACE);
+      return isFlagSet(CHILDREN_MODIFIED_IN_WORKSPACE);
    }
 
    public boolean isChildrenLoaded()
@@ -101,7 +101,7 @@
 
    public boolean isResurrected()
    {
-      return flags.contains(RESURRECTED_IN_WORKSPACE);
+      return isFlagSet(RESURRECTED_IN_WORKSPACE);
    }
 
    public void markAsResurrected(boolean resurrected)
@@ -125,7 +125,7 @@
     */
    public boolean isModified()
    {
-      return flags.contains(MODIFIED_IN_WORKSPACE);
+      return isFlagSet(MODIFIED_IN_WORKSPACE);
    }
 
    /**
@@ -146,7 +146,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)
@@ -157,7 +157,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);
 
@@ -165,7 +165,7 @@
 
    public V remove(K key)
    {
-      setFlag(MODIFIED_IN_WORKSPACE, true);
+      setFlag(MODIFIED_IN_WORKSPACE);
       if (optimisticDataMap == null) return null;
       return optimisticDataMap.remove(key);
 
@@ -213,7 +213,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();
@@ -241,13 +241,13 @@
       NodeSPI<K, V> child = nodeFactory.createNode(childName, Fqn.fromRelativeElements(parent.getFqn(), childName), parent, null, true);
       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)
@@ -308,12 +308,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!!!
    }
 
@@ -388,7 +388,7 @@
       if (optimisticDataMap != null)
       {
          optimisticDataMap.clear();
-         setFlag(MODIFIED_IN_WORKSPACE, true);
+         setFlag(MODIFIED_IN_WORKSPACE);
       }
    }
 
@@ -476,7 +476,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