ensure that core clasloader is not added to parents

GitOrigin-RevId: 7da9f6edcef4e76005619f186c4c6c7aaeb823f1
This commit is contained in:
Vladimir Krivosheev
2020-10-22 06:43:11 +00:00
committed by intellij-monorepo-bot
parent b73ea35c16
commit fbc8bf6d9e
2 changed files with 36 additions and 31 deletions
@@ -119,7 +119,7 @@ final class ClassLoaderConfigurator {
getLogger().error(PluginLoadingError.formatErrorMessage(mainDependent,
"requires missing class loader for '" + dependencyDescriptor.getName() + "'"));
}
else if (loader != coreLoader || !usePluginClassLoader) {
else if (loader != coreLoader) {
loaders.add(loader);
}
}
@@ -195,15 +195,15 @@ final class ClassLoaderConfigurator {
}
}
private static void addLoaderOrLogError(@NotNull IdeaPluginDescriptorImpl dependent,
@NotNull IdeaPluginDescriptorImpl dependency,
@NotNull Collection<ClassLoader> loaders) {
private void addLoaderOrLogError(@NotNull IdeaPluginDescriptorImpl dependent,
@NotNull IdeaPluginDescriptorImpl dependency,
@NotNull Collection<ClassLoader> loaders) {
ClassLoader loader = dependency.getClassLoader();
if (loader == null) {
getLogger().error(PluginLoadingError.formatErrorMessage(dependent,
"requires missing class loader for '" + dependency.getName() + "'"));
}
else {
else if (loader != coreLoader) {
loaders.add(loader);
}
}
@@ -5,6 +5,7 @@ import com.intellij.diagnostic.PluginException;
import com.intellij.diagnostic.StartUpMeasurer;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.PluginDescriptor;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.util.ArrayUtil;
@@ -36,20 +37,19 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
private static final AtomicInteger instanceIdProducer = new AtomicInteger();
private ClassLoader[] myParents;
private final PluginDescriptor myPluginDescriptor;
private final List<String> myLibDirectories;
private ClassLoader[] parents;
private final PluginDescriptor pluginDescriptor;
private final List<String> libDirectories;
private final AtomicLong edtTime = new AtomicLong();
private final AtomicLong backgroundTime = new AtomicLong();
private final AtomicInteger loadedClassCounter = new AtomicInteger();
private final ClassLoader myCoreLoader;
private final ClassLoader coreLoader;
// to simplify analyzing of heap dump (dynamic plugin reloading)
private final PluginId pluginId;
private final int instanceId;
public PluginClassLoader(@NotNull List<URL> urls,
@@ -68,21 +68,24 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
instanceId = instanceIdProducer.incrementAndGet();
myParents = parents;
myPluginDescriptor = pluginDescriptor;
this.parents = parents;
this.pluginDescriptor = pluginDescriptor;
pluginId = pluginDescriptor.getPluginId();
myCoreLoader = coreLoader;
this.coreLoader = coreLoader;
if (coreLoader != null && PluginClassLoader.class.desiredAssertionStatus()) {
for (ClassLoader parent : myParents) {
assert parent != coreLoader;
for (ClassLoader parent : this.parents) {
if (parent == coreLoader) {
Logger.getInstance(PluginClassLoader.class).error("Core loader must be not specified in parents " +
"(parents=" + Arrays.toString(parents) + ", coreLoader=" + coreLoader + ")");
}
}
}
myLibDirectories = new SmartList<>();
libDirectories = new SmartList<>();
if (pluginRoot != null) {
Path libDir = pluginRoot.resolve("lib");
if (Files.exists(libDir)) {
myLibDirectories.add(libDir.toAbsolutePath().toString());
libDirectories.add(libDir.toAbsolutePath().toString());
}
}
}
@@ -149,8 +152,10 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
Set<ClassLoader> visited,
ParameterType parameter,
boolean withRoot) {
for (ClassLoader parent : myParents) {
assert parent != myCoreLoader;
for (ClassLoader parent : parents) {
if (parent == coreLoader) {
continue;
}
if (visited == null) {
visited = new HashSet<>();
visited.add(this);
@@ -175,8 +180,8 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
}
}
if (withRoot && myCoreLoader != null && (visited == null || visited.add(myCoreLoader))) {
return actionWithClassloader.execute(name, myCoreLoader, parameter);
if (withRoot && coreLoader != null && (visited == null || visited.add(coreLoader))) {
return actionWithClassloader.execute(name, coreLoader, parameter);
}
return null;
@@ -381,14 +386,14 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
@SuppressWarnings("UnusedDeclaration")
public void addLibDirectories(@NotNull Collection<String> libDirectories) {
myLibDirectories.addAll(libDirectories);
this.libDirectories.addAll(libDirectories);
}
@Override
protected String findLibrary(String libName) {
if (!myLibDirectories.isEmpty()) {
if (!libDirectories.isEmpty()) {
String libFileName = System.mapLibraryName(libName);
ListIterator<String> i = myLibDirectories.listIterator(myLibDirectories.size());
ListIterator<String> i = libDirectories.listIterator(libDirectories.size());
while (i.hasPrevious()) {
File libFile = new File(i.previous(), libFileName);
if (libFile.exists()) {
@@ -406,12 +411,12 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
@Override
public @NotNull PluginDescriptor getPluginDescriptor() {
return myPluginDescriptor;
return pluginDescriptor;
}
@Override
public String toString() {
return "PluginClassLoader[" + myPluginDescriptor + "] " + super.toString();
return "PluginClassLoader[" + pluginDescriptor + "] " + super.toString();
}
private static final class DeepEnumeration implements Enumeration<URL> {
@@ -447,19 +452,19 @@ public final class PluginClassLoader extends UrlClassLoader implements PluginAwa
@ApiStatus.Internal
public @NotNull List<ClassLoader> _getParents() {
//noinspection SSBasedInspection
return Collections.unmodifiableList(Arrays.asList(myParents));
return Collections.unmodifiableList(Arrays.asList(parents));
}
@ApiStatus.Internal
public void attachParent(@NotNull ClassLoader classLoader) {
myParents = ArrayUtil.append(myParents, classLoader);
parents = ArrayUtil.append(parents, classLoader);
}
@ApiStatus.Internal
public boolean detachParent(@NotNull ClassLoader classLoader) {
int oldSize = myParents.length;
myParents = ArrayUtil.remove(myParents, classLoader);
return myParents.length == oldSize - 1;
int oldSize = parents.length;
parents = ArrayUtil.remove(parents, classLoader);
return parents.length == oldSize - 1;
}
@Override