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