You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/09/11 06:28:22 UTC

[41/50] logging-log4j2 git commit: LOG4J2-1349 implement support for freeze() and isFrozen() in OpenHashMapContextData (for MutableContextData interface change)

LOG4J2-1349 implement support for freeze() and isFrozen() in OpenHashMapContextData (for MutableContextData interface change)


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7615afad
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7615afad
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7615afad

Branch: refs/heads/master
Commit: 7615afadd1ba368ed07e8967c270940f624925bb
Parents: 191c3f9
Author: rpopma <rp...@apache.org>
Authored: Sun Sep 4 19:33:46 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Sep 4 19:33:46 2016 +0900

----------------------------------------------------------------------
 .../log4j/perf/nogc/OpenHashMapContextData.java | 85 +++++++++++++++-----
 1 file changed, 67 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7615afad/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashMapContextData.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashMapContextData.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashMapContextData.java
index 26bdf53..a7357b8 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashMapContextData.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashMapContextData.java
@@ -67,6 +67,7 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
     /** The default load factor of a hash table. */
     public static final float DEFAULT_LOAD_FACTOR = .75f;
 
+    private static final String FROZEN = "Frozen collection cannot be modified";
     private static final long serialVersionUID = -1486744623338827187L;
 
     /** The array of keys. */
@@ -89,6 +90,8 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
     protected final float loadFactor;
 
     private V defRetValue = null;
+    private boolean immutable;
+    private transient boolean iterating;
 
     /**
      * Creates a new hash map with initial expected
@@ -193,6 +196,18 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
         }
     };
 
+    private void assertNotFrozen() {
+        if (immutable) {
+            throw new UnsupportedOperationException(FROZEN);
+        }
+    }
+
+    private void assertNoConcurrentModification() {
+        if (iterating) {
+            throw new ConcurrentModificationException();
+        }
+    }
+
     @SuppressWarnings("unchecked")
     private void initFrom0(final OpenHashMapContextData other) {
         // this.loadFactor = other.loadFactor; // final field
@@ -250,6 +265,9 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
         if (size == 0) {
             return;
         }
+        assertNotFrozen();
+        assertNoConcurrentModification();
+
         size = 0;
         containsNullKey = false;
         Arrays.fill(keys, (null));
@@ -323,20 +341,26 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
         final int startSize = size;
         final K myKeys[] = this.keys;
         int pos = arraySize;
-        if (containsNullKey) {
-            action.accept((String) myKeys[pos], (VAL) values[pos]);
-            if (size != startSize) {
-                throw new ConcurrentModificationException();
-            }
-        }
-        --pos;
-        for (; pos >= 0; pos--) {
-            if (myKeys[pos] != null) {
+
+        iterating = true;
+        try {
+            if (containsNullKey) {
                 action.accept((String) myKeys[pos], (VAL) values[pos]);
                 if (size != startSize) {
                     throw new ConcurrentModificationException();
                 }
             }
+            --pos;
+            for (; pos >= 0; pos--) {
+                if (myKeys[pos] != null) {
+                    action.accept((String) myKeys[pos], (VAL) values[pos]);
+                    if (size != startSize) {
+                        throw new ConcurrentModificationException();
+                    }
+                }
+            }
+        } finally {
+            iterating = false;
         }
     }
 
@@ -346,20 +370,26 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
         final int startSize = size;
         final K myKeys[] = this.keys;
         int pos = arraySize;
-        if (containsNullKey) {
-            action.accept((String) myKeys[pos], (VAL) values[pos], state);
-            if (size != startSize) {
-                throw new ConcurrentModificationException();
-            }
-        }
-        --pos;
-        for (; pos >= 0; pos--) {
-            if (myKeys[pos] != null) {
+
+        iterating = true;
+        try {
+            if (containsNullKey) {
                 action.accept((String) myKeys[pos], (VAL) values[pos], state);
                 if (size != startSize) {
                     throw new ConcurrentModificationException();
                 }
             }
+            --pos;
+            for (; pos >= 0; pos--) {
+                if (myKeys[pos] != null) {
+                    action.accept((String) myKeys[pos], (VAL) values[pos], state);
+                    if (size != startSize) {
+                        throw new ConcurrentModificationException();
+                    }
+                }
+            }
+        } finally {
+            iterating = false;
         }
     }
 
@@ -453,6 +483,9 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
 
     @Override
     public void putAll(final ContextData source) {
+        assertNotFrozen();
+        assertNoConcurrentModification();
+
         if (size() == 0 && source instanceof OpenHashMapContextData) {
             initFrom0((OpenHashMapContextData) source);
         } else if (source != null) {
@@ -475,6 +508,9 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
     }
 
     private V putObjectValue(final K k, final V v) {
+        assertNotFrozen();
+        assertNoConcurrentModification();
+
         final int pos = insert(k, v);
         if (pos < 0) {
             return defRetValue;
@@ -495,8 +531,21 @@ public class OpenHashMapContextData<K, V> implements MutableContextData, ThreadC
         removeObjectKey((Object) key);
     }
 
+    @Override
+    public void freeze() {
+        immutable = true;
+    }
+
+    @Override
+    public boolean isFrozen() {
+        return immutable;
+    }
+
     @SuppressWarnings("unchecked")
     private V removeObjectKey(final Object k) {
+        assertNotFrozen();
+        assertNoConcurrentModification();
+
         if (k == null) {
             if (containsNullKey) {
                 return removeNullEntry();