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/04 10:33:49 UTC
logging-log4j2 git commit: LOG4J2-1349 implement support for freeze()
and isFrozen() in OpenHashMapContextData (for MutableContextData interface
change)
Repository: logging-log4j2
Updated Branches:
refs/heads/LOG4J2-1349-gcfree-threadcontext 191c3f958 -> 7615afadd
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/LOG4J2-1349-gcfree-threadcontext
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();
Re: Re: logging-log4j2 git commit: LOG4J2-1349 implement support for
freeze() and isFrozen() in OpenHashMapContextData (for MutableContextData
interface change)
Posted by Remko Popma <re...@gmail.com>.
This does not create a new object, but changes an existing object.
On Mon, Sep 5, 2016 at 1:09 AM, Gary Gregory <ga...@gmail.com> wrote:
> Wait a sec. If this creates a new object, it should be a "to" or "as"
> method. If not, then yeah, freeze seems ok.
>
> Gary
>
> On Sep 4, 2016 12:03 PM, "Remko Popma" <re...@gmail.com> wrote:
>
>> I Googled if there was any established terminology for turning a mutable
>> object into an immutable one and "freeze" came up multiple times.
>>
>>
>>
>>
>> On Sun, Sep 4, 2016 at 11:48 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> Resending:
>>>
>>> Hm... the "freeze" terminology seems odd. Why not "lock"?
>>>
>>> Gary
>>>
>>> >
>>> >
>>> > On Sep 4, 2016 6:33 AM, <rp...@apache.org> wrote:
>>> >>
>>> >> Repository: logging-log4j2
>>> >> Updated Branches:
>>> >> refs/heads/LOG4J2-1349-gcfree-threadcontext 191c3f958 -> 7615afadd
>>> >>
>>> >>
>>> >> 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/7
>>> 615afad
>>> >> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7
>>> 615afad
>>> >>
>>> >> Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext
>>> >> 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/7
>>> 615afad/log4j-perf/src/main/java/org/apache/logging/log4j/pe
>>> rf/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/nog
>>> c/OpenHashMapContextData.java
>>> >> index 26bdf53..a7357b8 100644
>>> >> --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nog
>>> c/OpenHashMapContextData.java
>>> >> +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nog
>>> c/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();
>>> >>
>>>
>>
>>
Re: Re: logging-log4j2 git commit: LOG4J2-1349 implement support for
freeze() and isFrozen() in OpenHashMapContextData (for MutableContextData
interface change)
Posted by Gary Gregory <ga...@gmail.com>.
Wait a sec. If this creates a new object, it should be a "to" or "as"
method. If not, then yeah, freeze seems ok.
Gary
On Sep 4, 2016 12:03 PM, "Remko Popma" <re...@gmail.com> wrote:
> I Googled if there was any established terminology for turning a mutable
> object into an immutable one and "freeze" came up multiple times.
>
>
>
>
> On Sun, Sep 4, 2016 at 11:48 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> Resending:
>>
>> Hm... the "freeze" terminology seems odd. Why not "lock"?
>>
>> Gary
>>
>> >
>> >
>> > On Sep 4, 2016 6:33 AM, <rp...@apache.org> wrote:
>> >>
>> >> Repository: logging-log4j2
>> >> Updated Branches:
>> >> refs/heads/LOG4J2-1349-gcfree-threadcontext 191c3f958 -> 7615afadd
>> >>
>> >>
>> >> 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/7
>> 615afad
>> >> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7
>> 615afad
>> >>
>> >> Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext
>> >> 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/7
>> 615afad/log4j-perf/src/main/java/org/apache/logging/log4j/pe
>> rf/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/nog
>> c/OpenHashMapContextData.java
>> >> index 26bdf53..a7357b8 100644
>> >> --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nog
>> c/OpenHashMapContextData.java
>> >> +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nog
>> c/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();
>> >>
>>
>
>
Re: Re: logging-log4j2 git commit: LOG4J2-1349 implement support for
freeze() and isFrozen() in OpenHashMapContextData (for MutableContextData
interface change)
Posted by Remko Popma <re...@gmail.com>.
I Googled if there was any established terminology for turning a mutable
object into an immutable one and "freeze" came up multiple times.
On Sun, Sep 4, 2016 at 11:48 PM, Gary Gregory <ga...@gmail.com>
wrote:
> Resending:
>
> Hm... the "freeze" terminology seems odd. Why not "lock"?
>
> Gary
>
> >
> >
> > On Sep 4, 2016 6:33 AM, <rp...@apache.org> wrote:
> >>
> >> Repository: logging-log4j2
> >> Updated Branches:
> >> refs/heads/LOG4J2-1349-gcfree-threadcontext 191c3f958 -> 7615afadd
> >>
> >>
> >> 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/LOG4J2-1349-gcfree-threadcontext
> >> 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();
> >>
>
Fwd: Re: logging-log4j2 git commit: LOG4J2-1349 implement support for
freeze() and isFrozen() in OpenHashMapContextData (for MutableContextData
interface change)
Posted by Gary Gregory <ga...@gmail.com>.
Resending:
Hm... the "freeze" terminology seems odd. Why not "lock"?
Gary
>
>
> On Sep 4, 2016 6:33 AM, <rp...@apache.org> wrote:
>>
>> Repository: logging-log4j2
>> Updated Branches:
>> refs/heads/LOG4J2-1349-gcfree-threadcontext 191c3f958 -> 7615afadd
>>
>>
>> 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/LOG4J2-1349-gcfree-threadcontext
>> 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();
>>