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 <[email protected]>
Authored: Sun Dec 10 19:50:03 2017 +0800
Committer: sunlan <[email protected]>
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 <[email protected]>
  * @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) {

Reply via email to