mirror of https://github.com/sbt/sbt.git
Merge pull request #5267 from eatkins/zombie-concurrency
Make ZombieClassLoader thread safe
This commit is contained in:
commit
47985e33ae
|
|
@ -39,13 +39,16 @@ abstract class ManagedClassLoader extends URLClassLoader implements NativeLoader
|
||||||
private final URL[] urls;
|
private final URL[] urls;
|
||||||
|
|
||||||
ZombieClassLoader(URL[] urls) {
|
ZombieClassLoader(URL[] urls) {
|
||||||
super(urls, ManagedClassLoader.this);
|
super(urls, ManagedClassLoader.this.getParent());
|
||||||
this.urls = urls;
|
this.urls = urls;
|
||||||
}
|
}
|
||||||
|
|
||||||
Class<?> lookupClass(final String name) throws ClassNotFoundException {
|
Class<?> lookupClass(final String name) throws ClassNotFoundException {
|
||||||
try {
|
try {
|
||||||
return findClass(name);
|
synchronized (getClassLoadingLock(name)) {
|
||||||
|
final Class<?> previous = findLoadedClass(name);
|
||||||
|
return previous != null ? previous : findClass(name);
|
||||||
|
}
|
||||||
} catch (final ClassNotFoundException e) {
|
} catch (final ClassNotFoundException e) {
|
||||||
final StringBuilder builder = new StringBuilder();
|
final StringBuilder builder = new StringBuilder();
|
||||||
for (final URL u : urls) {
|
for (final URL u : urls) {
|
||||||
|
|
@ -89,7 +92,12 @@ abstract class ManagedClassLoader extends URLClassLoader implements NativeLoader
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
||||||
return closed.get() ? getZombieLoader(name).lookupClass(name) : super.findClass(name);
|
try {
|
||||||
|
return super.findClass(name);
|
||||||
|
} catch (final NoClassDefFoundError | ClassNotFoundException e) {
|
||||||
|
if (closed.get()) return getZombieLoader(name).lookupClass(name);
|
||||||
|
else throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue