Repository: groovy Updated Branches: refs/heads/master b93529ed2 -> b7be8be77
Minor refactoring: implement ExtensionMethodCache 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/b7be8be7 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/b7be8be7 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/b7be8be7 Branch: refs/heads/master Commit: b7be8be774481d5e093e14b2ec6a99b156a55ea1 Parents: b93529e Author: sunlan <[email protected]> Authored: Sun Dec 10 21:39:09 2017 +0800 Committer: sunlan <[email protected]> Committed: Sun Dec 10 21:39:09 2017 +0800 ---------------------------------------------------------------------- .../stc/StaticTypeCheckingSupport.java | 67 +++++++++----------- 1 file changed, 30 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/b7be8be7/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java index 578f0b9..1090125 100644 --- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java +++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java @@ -46,13 +46,14 @@ import org.codehaus.groovy.runtime.DefaultGroovyStaticMethods; 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.CommonCache; +import org.codehaus.groovy.runtime.memoize.EvictableCache; import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl; import org.codehaus.groovy.tools.GroovyClass; import org.codehaus.groovy.transform.trait.Traits; import org.codehaus.groovy.vmplugin.VMPluginFactory; import org.objectweb.asm.Opcodes; -import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; @@ -68,7 +69,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeSet; import java.util.UUID; -import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.WeakHashMap; import java.util.regex.Matcher; import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE; @@ -2159,46 +2160,38 @@ public abstract class StaticTypeCheckingSupport { * collect the list of extension methods (see {@link ExtensionModule} if the list of * extension modules has changed. It avoids recomputing the whole list each time we perform * a method lookup. - * TODO reuse {@link org.codehaus.groovy.runtime.memoize.CommonCache} */ private static class ExtensionMethodCache { - - private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); - private Map<String, List<MethodNode>> cachedMethods = null; - private WeakReference<ClassLoader> origin = new WeakReference<ClassLoader>(null); + private final CommonCache<ClassLoader, Map<String, List<MethodNode>>> cache = new CommonCache<ClassLoader, Map<String, List<MethodNode>>>(new WeakHashMap<>()); public Map<String, List<MethodNode>> getExtensionMethods(ClassLoader loader) { - lock.readLock().lock(); - if (loader!=origin.get()) { - lock.readLock().unlock(); - lock.writeLock().lock(); - try { - final List<ExtensionModule> modules = new LinkedList<ExtensionModule>(); - ExtensionModuleScanner scanner = new ExtensionModuleScanner(new ExtensionModuleScanner.ExtensionModuleListener() { - public void onModule(final ExtensionModule module) { - boolean skip = false; - for (ExtensionModule extensionModule : modules) { - if (extensionModule.getName().equals(module.getName())) { - skip = true; - break; - } - } - if (!skip) modules.add(module); + return cache.getAndPut( + loader, + new EvictableCache.ValueProvider<ClassLoader, Map<String, List<MethodNode>>>() { + @Override + public Map<String, List<MethodNode>> provide(final ClassLoader key) { + final List<ExtensionModule> modules = new LinkedList<ExtensionModule>(); + ExtensionModuleScanner scanner = + new ExtensionModuleScanner( + new ExtensionModuleScanner.ExtensionModuleListener() { + public void onModule(final ExtensionModule module) { + boolean skip = false; + for (ExtensionModule extensionModule : modules) { + if (extensionModule.getName().equals(module.getName())) { + skip = true; + break; + } + } + if (!skip) modules.add(module); + } + }, + key + ); + scanner.scanClasspathModules(); + + return getDGMMethods(modules); } - }, loader); - scanner.scanClasspathModules(); - cachedMethods = getDGMMethods(modules); - origin = new WeakReference<ClassLoader>(loader); - lock.readLock().lock(); - } finally { - lock.writeLock().unlock(); - } - } - try { - return Collections.unmodifiableMap(cachedMethods); - } finally { - lock.readLock().unlock(); - } + }); } /**
