You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by jw...@apache.org on 2016/01/28 06:35:03 UTC
groovy git commit: Fix finalizeReference method override for
ManagedReference subclasses (closes #220)
Repository: groovy
Updated Branches:
refs/heads/master b5f039685 -> 219447d0b
Fix finalizeReference method override for ManagedReference subclasses (closes #220)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/219447d0
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/219447d0
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/219447d0
Branch: refs/heads/master
Commit: 219447d0be82ed5cfdc52c57293bd43d8edde2dc
Parents: b5f0396
Author: John Wagenleitner <jw...@apache.org>
Authored: Sun Jan 24 11:12:38 2016 -0800
Committer: John Wagenleitner <jw...@apache.org>
Committed: Wed Jan 27 21:33:52 2016 -0800
----------------------------------------------------------------------
.../groovy/util/ManagedConcurrentMap.java | 21 +++++++---
.../groovy/util/ManagedConcurrentValueMap.java | 4 +-
.../groovy/util/ManagedDoubleKeyMap.java | 11 ++++--
.../codehaus/groovy/util/ManagedLinkedList.java | 1 +
.../groovy/util/ManagedConcurrentMapTest.groovy | 41 ++++++++++++++++++++
.../util/ManagedConcurrentValueMapTest.groovy | 38 ++++++++++++++++++
.../groovy/util/ManagedDoubleKeyMapTest.groovy | 41 ++++++++++++++++++++
7 files changed, 146 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/main/org/codehaus/groovy/util/ManagedConcurrentMap.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/util/ManagedConcurrentMap.java b/src/main/org/codehaus/groovy/util/ManagedConcurrentMap.java
index 0c1a7c7..db44a00 100644
--- a/src/main/org/codehaus/groovy/util/ManagedConcurrentMap.java
+++ b/src/main/org/codehaus/groovy/util/ManagedConcurrentMap.java
@@ -76,9 +76,18 @@ public class ManagedConcurrentMap<K,V> extends AbstractConcurrentMap<K,V> {
return hash;
}
- public void finalizeRef() {
- super.finalizeReference();
+ @Override
+ public void finalizeReference() {
segment.removeEntry(this);
+ super.finalizeReference();
+ }
+
+ /**
+ * @deprecated use finalizeReference
+ */
+ @Deprecated
+ public void finalizeRef() {
+ finalizeReference();
}
}
@@ -90,18 +99,20 @@ public class ManagedConcurrentMap<K,V> extends AbstractConcurrentMap<K,V> {
setValue(value);
}
+ @Override
public V getValue() {
return value;
}
+ @Override
public void setValue(V value) {
this.value = value;
}
-
- public void finalizeRef() {
+ @Override
+ public void finalizeReference() {
value = null;
- super.finalizeRef();
+ super.finalizeReference();
}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/main/org/codehaus/groovy/util/ManagedConcurrentValueMap.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/util/ManagedConcurrentValueMap.java b/src/main/org/codehaus/groovy/util/ManagedConcurrentValueMap.java
index a9d12c6..f28ee68 100644
--- a/src/main/org/codehaus/groovy/util/ManagedConcurrentValueMap.java
+++ b/src/main/org/codehaus/groovy/util/ManagedConcurrentValueMap.java
@@ -22,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap;
/**
* This is a basic implementation of a map able to forget its values. This
- * map uses internally a ConcurrentHashMap, thus should be save for concurrency.
+ * map uses internally a ConcurrentHashMap, thus should be safe for concurrency.
* hashcode and equals are used to find the entries and should thus be implemented
* properly for the keys. This map does not support null keys.
* @author <a href="mailto:blackdrag@gmx.org">Jochen "blackdrag" Theodorou</a>
@@ -67,8 +67,8 @@ public class ManagedConcurrentValueMap<K,V> {
ManagedReference<V> ref = new ManagedReference<V>(bundle, value) {
@Override
public void finalizeReference() {
+ internalMap.remove(key, this);
super.finalizeReference();
- internalMap.remove(key, get());
}
};
internalMap.put(key, ref);
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/main/org/codehaus/groovy/util/ManagedDoubleKeyMap.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/util/ManagedDoubleKeyMap.java b/src/main/org/codehaus/groovy/util/ManagedDoubleKeyMap.java
index 65b2ee6..9dfe170 100644
--- a/src/main/org/codehaus/groovy/util/ManagedDoubleKeyMap.java
+++ b/src/main/org/codehaus/groovy/util/ManagedDoubleKeyMap.java
@@ -48,8 +48,10 @@ public class ManagedDoubleKeyMap<K1,K2,V> extends AbstractConcurrentDoubleKeyMap
this.entry = entry;
}
- public void finalizeRef() {
+ @Override
+ public void finalizeReference() {
this.entry.clean();
+ super.finalizeReference();
}
}
@@ -87,8 +89,6 @@ public class ManagedDoubleKeyMap<K1,K2,V> extends AbstractConcurrentDoubleKeyMap
public void clean() {
segment.removeEntry(this);
- ref1.clear();
- ref2.clear();
}
}
@@ -99,17 +99,20 @@ public class ManagedDoubleKeyMap<K1,K2,V> extends AbstractConcurrentDoubleKeyMap
super(bundle, key1, key2, hash, segment);
}
+ @Override
public V getValue() {
return value;
}
+ @Override
public void setValue(V value) {
this.value = value;
}
+ @Override
public void clean() {
- super.clean();
value = null;
+ super.clean();
}
}
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/main/org/codehaus/groovy/util/ManagedLinkedList.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/util/ManagedLinkedList.java b/src/main/org/codehaus/groovy/util/ManagedLinkedList.java
index cc06c2a..5f7bab5 100644
--- a/src/main/org/codehaus/groovy/util/ManagedLinkedList.java
+++ b/src/main/org/codehaus/groovy/util/ManagedLinkedList.java
@@ -40,6 +40,7 @@ public class ManagedLinkedList<T> {
super(bundle, value);
}
+ @Override
public void finalizeReference() {
if (previous != null && previous.next != null) {
previous.next = next;
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/test/org/codehaus/groovy/util/ManagedConcurrentMapTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/util/ManagedConcurrentMapTest.groovy b/src/test/org/codehaus/groovy/util/ManagedConcurrentMapTest.groovy
new file mode 100644
index 0000000..7fe81f6
--- /dev/null
+++ b/src/test/org/codehaus/groovy/util/ManagedConcurrentMapTest.groovy
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.util
+
+class ManagedConcurrentMapTest extends GroovyTestCase {
+
+ ManagedConcurrentMap<Object, String> map =
+ new ManagedConcurrentMap<Object, String>(ReferenceBundle.getHardBundle())
+
+ void testEntriesRemoveSelfFromMapWhenFinalized() {
+ List<ManagedReference<Object>> entries = []
+ for (int i = 0; i < 5; i++) {
+ entries << map.getOrPut(new Object(), "Object ${i}")
+ }
+
+ assert map.size() == 5
+ assert map.fullSize() == 5
+
+ entries*.finalizeReference()
+
+ assert map.size() == 0
+ assert map.fullSize() == 0
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/test/org/codehaus/groovy/util/ManagedConcurrentValueMapTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/util/ManagedConcurrentValueMapTest.groovy b/src/test/org/codehaus/groovy/util/ManagedConcurrentValueMapTest.groovy
new file mode 100644
index 0000000..90e59dd
--- /dev/null
+++ b/src/test/org/codehaus/groovy/util/ManagedConcurrentValueMapTest.groovy
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.util
+
+class ManagedConcurrentValueMapTest extends GroovyTestCase {
+
+ ManagedConcurrentValueMap<String, Object> map =
+ new ManagedConcurrentValueMap<String, Object>(ReferenceBundle.getHardBundle())
+
+ void testEntriesRemoveSelfFromMapWhenFinalized() {
+ for (int i = 0; i < 5; i++) {
+ map.put("Key${i}", new Object())
+ }
+
+ assert map.@internalMap.size() == 5
+
+ Collection<ManagedReference<Object>> values = map.@internalMap.values()
+ values*.finalizeReference()
+
+ assert map.@internalMap.size() == 0
+ }
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/219447d0/src/test/org/codehaus/groovy/util/ManagedDoubleKeyMapTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/util/ManagedDoubleKeyMapTest.groovy b/src/test/org/codehaus/groovy/util/ManagedDoubleKeyMapTest.groovy
new file mode 100644
index 0000000..82a90d9
--- /dev/null
+++ b/src/test/org/codehaus/groovy/util/ManagedDoubleKeyMapTest.groovy
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.util
+
+class ManagedDoubleKeyMapTest extends GroovyTestCase {
+
+ ManagedDoubleKeyMap<Object, Object, String> map =
+ new ManagedDoubleKeyMap<Object, Object, String>(ReferenceBundle.getHardBundle())
+
+ void testEntriesRemoveSelfFromMapWhenFinalized() {
+ def entries = []
+ for (int i = 0; i < 5; i++) {
+ entries << map.getOrPut(new Object(), new Object(), "Value${i}")
+ }
+
+ assert map.size() == 5
+ assert map.fullSize() == 5
+
+ entries*.clean()
+
+ assert map.size() == 0
+ assert map.fullSize() == 0
+ }
+
+}