@@ -22,6 +22,7 @@ import org.gradle.workers.WorkParameters
2222import org.gradle.workers.WorkerExecutor
2323
2424import javax.inject.Inject
25+ import java.util.concurrent.ConcurrentHashMap
2526import java.util.regex.Matcher
2627
2728/**
@@ -177,35 +178,33 @@ interface InstrumentWorkParameters extends WorkParameters {
177178
178179abstract 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