[hg] main-silver: #219962: An active implementation of weak hash...

  • From:
  • To:
  • Subject: [hg] main-silver: #219962: An active implementation of weak hash...
  • Date: Wed, 14 Nov 2012 10:43:17 -0800

changeset 9bb864527e30 in main-silver ((none))
details: http://hg.netbeans.org/main-silver/rev/9bb864527e30
description:
        #219962: An active implementation of weak hash map is used to hold 
the source handles. The entries are removed automatically as soon as they are 
freed by GC.

diffstat:

 
debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/EditorContextImpl.java
               |    4 +-
 
debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActive.java
               |  151 ++++++++++
 
debugger.jpda.projects/test/unit/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActiveTest.java
 |   87 +++++
 3 files changed, 240 insertions(+), 2 deletions(-)

diffs (262 lines):

diff --git 
a/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/EditorContextImpl.java
 
b/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/EditorContextImpl.java
--- 
a/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/EditorContextImpl.java
+++ 
b/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/EditorContextImpl.java
@@ -172,8 +172,8 @@
     private Map                     annotationToURL = new HashMap ();
     private PropertyChangeListener  dispatchListener;
     private EditorContextDispatcher contextDispatcher;
-    private final Map<JavaSource, JavaSourceUtil.Handle> sourceHandles = new 
WeakHashMap<JavaSource, JavaSourceUtil.Handle>();
-    private final Map<JavaSource, Date> sourceModifStamps = new 
WeakHashMap<JavaSource, Date>();
+    private final Map<JavaSource, JavaSourceUtil.Handle> sourceHandles = new 
WeakHashMapActive<JavaSource, JavaSourceUtil.Handle>();
+    private final Map<JavaSource, Date> sourceModifStamps = new 
WeakHashMapActive<JavaSource, Date>();
     private DebuggerManagerListener sessionsListener; // cleans up 
sourceHandles
 
 
diff --git 
a/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActive.java
 
b/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActive.java
new file mode 100644
--- /dev/null
+++ 
b/debugger.jpda.projects/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActive.java
@@ -0,0 +1,151 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2012 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ *
+ * Portions Copyrighted 2012 Sun Microsystems, Inc.
+ */
+package org.netbeans.modules.debugger.jpda.projects;
+
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.openide.util.lookup.implspi.ActiveQueue;
+
+/**
+ * A weak hash map, that automatically release entries as soon as they are 
freed by GC.
+ * <p/>
+ * Do not use many instances of this class, as every instance is creating 
it's own
+ * listening thread. If many instances is to be used, this needs a rewrite 
to use
+ * a single listening thread on a single ReferenceQueue.
+ * 
+ * @author Martin Entlicher
+ */
+public class WeakHashMapActive<K,V> extends AbstractMap<K,V> {
+    
+    private final ReferenceQueue<Object> queue;
+    private final Map<Reference<K>, V> map;
+    
+    public WeakHashMapActive() {
+        super();
+        map = new HashMap<Reference<K>, V>();
+        queue = ActiveQueue.queue();
+    }
+    
+    @Override
+    public V put(K key, V value) {
+        Reference<K> rk = new KeyReference<K>(key, queue);
+        synchronized (map) {
+            return map.put(rk, value);
+        }
+    }
+
+    @Override
+    public V get(Object key) {
+        Reference<Object> rk = new KeyReference<Object>(key, null);
+        synchronized (map) {
+            return map.get(rk);
+        }
+    }
+
+    @Override
+    public V remove(Object key) {
+        Reference<Object> rk = new KeyReference<Object>(key, null);
+        synchronized (map) {
+            return map.remove(rk);
+        }
+    }
+    
+    @Override
+    public void clear() {
+        synchronized (map) {
+            map.clear();
+        }
+    }
+
+    @Override
+    public int size() {
+        synchronized (map) {
+            return map.size();
+        }
+    }
+    
+    @Override
+    public Set<Entry<K, V>> entrySet() {
+        throw new UnsupportedOperationException("Not supported.");
+    }
+    
+    private class KeyReference<K> extends WeakReference<K> implements 
Runnable {
+        
+        private final int hash;
+        
+        KeyReference(K r, ReferenceQueue<? super K> queue) {
+            super(r, queue);
+            hash = r.hashCode();
+        }
+
+        @Override
+        public int hashCode() {
+            return hash;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!(obj instanceof KeyReference)) {
+                return false;
+            }
+            KeyReference kr = (KeyReference) obj;
+            K k1 = get();
+            Object k2 = kr.get();
+            return (k1 == k2 || (k1 != null && k1.equals(k2)));
+        }
+
+        @Override
+        public void run() {
+            // Collected
+            synchronized (map) {
+                map.remove(this);
+            }
+        }
+        
+    }
+    
+}
diff --git 
a/debugger.jpda.projects/test/unit/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActiveTest.java
 
b/debugger.jpda.projects/test/unit/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActiveTest.java
new file mode 100644
--- /dev/null
+++ 
b/debugger.jpda.projects/test/unit/src/org/netbeans/modules/debugger/jpda/projects/WeakHashMapActiveTest.java
@@ -0,0 +1,87 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2012 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ *
+ * Portions Copyrighted 2012 Sun Microsystems, Inc.
+ */
+package org.netbeans.modules.debugger.jpda.projects;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import org.netbeans.junit.NbTestCase;
+
+/**
+ *
+ * @author Martin Entlicher
+ */
+public class WeakHashMapActiveTest extends NbTestCase {
+    
+    public WeakHashMapActiveTest(String name) {
+        super(name);
+    }
+    
+    public void testRelease() throws Exception {
+        Object k1 = new Object();
+        Object k2 = new Object();
+        Object v1 = new Object();
+        Object v2 = new Object();
+        Reference rv1 = new WeakReference(v1);
+        Reference rv2 = new WeakReference(v2);
+        WeakHashMapActive whma = new WeakHashMapActive();
+        whma.put(k1, v1);
+        whma.put(k2, v2);
+        assertEquals("Size", 2, whma.size());
+        assertEquals(v1, whma.get(k1));
+        assertEquals(v2, whma.get(k2));
+        k1 = k2 = null;
+        System.gc();
+        int[] arr = new int[10000000];
+        arr[1000000] = 10;
+        arr = null;
+        System.gc();
+        assertEquals("Size", 0, whma.size());
+        v1 = v2 = null;
+        System.gc();
+        arr = new int[20000000];
+        arr[1000000] = 10;
+        arr = null;
+        System.gc();
+        assertNull(rv1.get());
+        assertNull(rv2.get());
+    }
+}

[hg] main-silver: #219962: An active implementation of weak hash...

mentlicher 11/14/2012

Project Features

About this Project

Debugger was started in November 2009, is owned by tpavek, and has 29 members.
By use of this website, you agree to the NetBeans Policies and Terms of Use (revision 20140418.2d69abc). © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo
 
 
Close
loading
Please Confirm
Close