You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2017/12/10 12:01:19 UTC

groovy git commit: Minor refactoring: implement MacroMethodsCache based on CommonCache

Repository: groovy
Updated Branches:
  refs/heads/master e26394b15 -> c6fbcb6f3


Minor refactoring: implement MacroMethodsCache based on CommonCache


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/c6fbcb6f
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/c6fbcb6f
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/c6fbcb6f

Branch: refs/heads/master
Commit: c6fbcb6f39d0f388d84f2c0464191fc06e9500ed
Parents: e26394b
Author: sunlan <su...@apache.org>
Authored: Sun Dec 10 19:50:03 2017 +0800
Committer: sunlan <su...@apache.org>
Committed: Sun Dec 10 19:50:03 2017 +0800

----------------------------------------------------------------------
 .../macro/transform/MacroMethodsCache.java      | 41 +++++---------------
 1 file changed, 9 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/c6fbcb6f/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
index 3b11420..4a7266d 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
@@ -26,6 +26,8 @@ import org.codehaus.groovy.macro.runtime.Macro;
 import org.codehaus.groovy.runtime.m12n.ExtensionModule;
 import org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner;
 import org.codehaus.groovy.runtime.m12n.MetaInfExtensionModule;
+import org.codehaus.groovy.runtime.memoize.EvictableCache;
+import org.codehaus.groovy.runtime.memoize.SimpleCache;
 import org.codehaus.groovy.transform.stc.ExtensionMethodNode;
 
 import java.util.ArrayList;
@@ -34,48 +36,23 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.WeakHashMap;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * TODO share some code with {@link org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.ExtensionMethodCache}
- * TODO reuse {@link org.codehaus.groovy.runtime.memoize.CommonCache}
  * @author Sergei Egorov <bs...@gmail.com>
  * @since 2.5.0
  */
 class MacroMethodsCache {
-
     private static final ClassNode MACRO_ANNOTATION_CLASS_NODE = ClassHelper.make(Macro.class);
+    private static final SimpleCache<ClassLoader, Map<String, List<MethodNode>>> CACHE = new SimpleCache<>(new WeakHashMap<>());
 
-    private static volatile Map<ClassLoader, Map<String, List<MethodNode>>> CACHE = new WeakHashMap<>();
-
-    private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
-
-    public static Map<String, List<MethodNode>> get(ClassLoader classLoader) {
-        try {
-            lock.readLock().lock();
-            if (!CACHE.containsKey(classLoader)) {
-                lock.readLock().unlock();
-                lock.writeLock().lock();
-
-                try {
-                    if (!CACHE.containsKey(classLoader)) {
-                        WeakHashMap<ClassLoader, Map<String, List<MethodNode>>> newCache = new WeakHashMap<>(CACHE);
-
-                        Map<String, List<MethodNode>> methods = getMacroMethodsFromClassLoader(classLoader);
-                        newCache.put(classLoader, methods);
-
-                        CACHE = Collections.unmodifiableMap(newCache);
-                    }
-                } finally {
-                    lock.readLock().lock();
-                    lock.writeLock().unlock();
-                }
+    public static Map<String, List<MethodNode>> get(final ClassLoader classLoader) {
+        return CACHE.getAndPut(classLoader, new EvictableCache.ValueProvider<ClassLoader, Map<String, List<MethodNode>>>() {
+            @Override
+            public Map<String, List<MethodNode>> provide(ClassLoader key) {
+                return getMacroMethodsFromClassLoader(key);
             }
-
-            return CACHE.get(classLoader);
-        } finally {
-            lock.readLock().unlock();
-        }
+        });
     }
 
     protected static Map<String, List<MethodNode>> getMacroMethodsFromClassLoader(ClassLoader classLoader) {