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) {