Skip to content

Commit f77c73f

Browse files
committed
Cache separate InstrumentPlugin class-loader for each distinct set of plugins
1 parent fcd4bc4 commit f77c73f

1 file changed

Lines changed: 12 additions & 13 deletions

File tree

buildSrc/src/main/groovy/InstrumentPlugin.groovy

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.gradle.workers.WorkParameters
2222
import org.gradle.workers.WorkerExecutor
2323

2424
import javax.inject.Inject
25+
import java.util.concurrent.ConcurrentHashMap
2526
import java.util.regex.Matcher
2627

2728
/**
@@ -177,35 +178,33 @@ interface InstrumentWorkParameters extends WorkParameters {
177178

178179
abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters> {
179180
private static final Object lock = new Object()
180-
private static ClassLoader pluginCL
181-
private static String cachedPluginPath
182-
private static volatile long cachedBuildStamp
181+
private static final Map<String, ClassLoader> classLoaderCache = new ConcurrentHashMap<>()
182+
private static volatile long lastBuildStamp
183183

184184
@Override
185185
void execute() {
186+
String[] plugins = parameters.getPlugins().get() as String[]
187+
String classLoaderKey = plugins.join(':')
188+
186189
// reset shared class-loaders each time a new build starts
187190
long buildStamp = parameters.buildStartedTime.get()
188-
String pluginPath = parameters.pluginClassPath.join(':')
189-
if (rebuildSharedClassLoader(buildStamp, pluginPath)) {
191+
ClassLoader pluginCL = classLoaderCache.get(classLoaderKey)
192+
if (lastBuildStamp < buildStamp || !pluginCL) {
190193
synchronized (lock) {
191-
if (rebuildSharedClassLoader(buildStamp, pluginPath)) {
194+
pluginCL = classLoaderCache.get(classLoaderKey)
195+
if (lastBuildStamp < buildStamp || !pluginCL) {
192196
pluginCL = createClassLoader(parameters.pluginClassPath)
193-
cachedPluginPath = pluginPath
194-
cachedBuildStamp = buildStamp
197+
classLoaderCache.put(classLoaderKey, pluginCL)
198+
lastBuildStamp = buildStamp
195199
}
196200
}
197201
}
198-
String[] plugins = parameters.getPlugins().get() as String[]
199202
File sourceDirectory = parameters.getSourceDirectory().get().asFile
200203
File targetDirectory = parameters.getTargetDirectory().get().asFile
201204
ClassLoader instrumentingCL = createClassLoader(parameters.instrumentingClassPath, pluginCL)
202205
InstrumentingPlugin.instrumentClasses(plugins, instrumentingCL, sourceDirectory, targetDirectory)
203206
}
204207

205-
static boolean rebuildSharedClassLoader(long buildStamp, String pluginPath) {
206-
return cachedBuildStamp < buildStamp || cachedPluginPath != pluginPath
207-
}
208-
209208
static ClassLoader createClassLoader(cp, parent = InstrumentAction.classLoader) {
210209
return new URLClassLoader(cp*.toURI()*.toURL() as URL[], parent as ClassLoader)
211210
}

0 commit comments

Comments
 (0)