Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2018-08-14 12:13:08 -0400
committerThomas Watson2018-08-14 12:29:44 -0400
commit0dfac454d2cfd78671f3c51ad96c70810e9b2e32 (patch)
tree7494ab2dfa788781c12d78e1e50dbe743d6f98cb
parentc26eaf1d2d4e9ddf1f1ec39bb03c4b07e68c4030 (diff)
downloadrt.equinox.framework-I20180814-2000.tar.gz
rt.equinox.framework-I20180814-2000.tar.xz
rt.equinox.framework-I20180814-2000.zip
Bug 537505 - Fix issues with priming multiple cp entriesI20180814-2000
When a host bundle has many classpath entries it was possible to miss the priming of the entries CDSBundleFile Change-Id: I4816b57bf425e202cbc4fa02ce5f0b7bd015a8ff Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSBundleFile.java8
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSHookImpls.java36
2 files changed, 39 insertions, 5 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSBundleFile.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSBundleFile.java
index 39588afd4..941a4118e 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSBundleFile.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSBundleFile.java
@@ -128,4 +128,12 @@ public class CDSBundleFile extends BundleFileWrapper {
return null;
return urlHelper.findSharedClass(null, url, name);
}
+
+ /**
+ * Returns the primed flag for this bundle file.
+ * @return the primed flag
+ */
+ public boolean getPrimed() {
+ return this.primed;
+ }
}
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSHookImpls.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSHookImpls.java
index 3322768e9..bde9bde34 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSHookImpls.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/cds/CDSHookImpls.java
@@ -35,6 +35,7 @@ import org.eclipse.osgi.internal.hookregistry.HookRegistry;
import org.eclipse.osgi.internal.loader.ModuleClassLoader;
import org.eclipse.osgi.internal.loader.classpath.ClasspathEntry;
import org.eclipse.osgi.internal.loader.classpath.ClasspathManager;
+import org.eclipse.osgi.internal.loader.classpath.FragmentClasspath;
import org.eclipse.osgi.storage.BundleInfo.Generation;
import org.eclipse.osgi.storage.bundlefile.BundleEntry;
import org.eclipse.osgi.storage.bundlefile.BundleFile;
@@ -143,18 +144,41 @@ public class CDSHookImpls extends ClassLoaderHook implements BundleFileWrapperFa
if (factory == null) {
return;
}
- CDSBundleFile hostFile = null;
try {
SharedClassURLHelper urlHelper = factory.getURLHelper(classLoader);
+ boolean minimizeUpdateChecks = urlHelper.setMinimizeUpdateChecks();
// set the url helper for the host base CDSBundleFile
- hostFile = getCDSBundleFile(classLoader.getClasspathManager().getGeneration().getBundleFile());
+ CDSBundleFile hostFile = getCDSBundleFile(classLoader.getClasspathManager().getGeneration().getBundleFile());
if (hostFile != null) {
hostFile.setURLHelper(urlHelper);
- if (urlHelper.setMinimizeUpdateChecks()) {
- // no need to prime if we were able to setsetMinimizeUpdateChecks
+ if (minimizeUpdateChecks) {
+ // no need to prime if we were able to setMinimizeUpdateChecks
hostFile.setPrimed(true);
}
}
+ // No need to prime if we were able to setMinimizeUpdateChecks.
+ // Mark all the BundleFiles on the classpath as primed.
+ ClasspathManager cpManager = classLoader.getClasspathManager();
+ for (ClasspathEntry entry : cpManager.getHostClasspathEntries()) {
+ CDSBundleFile cdsBundleFile = getCDSBundleFile(entry.getBundleFile());
+ if (cdsBundleFile != null) {
+ cdsBundleFile.setURLHelper(urlHelper);
+ if (minimizeUpdateChecks) {
+ cdsBundleFile.setPrimed(true);
+ }
+ }
+ }
+ for (FragmentClasspath fragCP : cpManager.getFragmentClasspaths()) {
+ for (ClasspathEntry entry : fragCP.getEntries()) {
+ CDSBundleFile cdsBundleFile = getCDSBundleFile(entry.getBundleFile());
+ if (cdsBundleFile != null) {
+ cdsBundleFile.setURLHelper(urlHelper);
+ if (minimizeUpdateChecks) {
+ cdsBundleFile.setPrimed(true);
+ }
+ }
+ }
+ }
} catch (HelperAlreadyDefinedException e) {
// We should never get here.
// If we do, we simply won't share for this ClassLoader
@@ -165,9 +189,11 @@ public class CDSHookImpls extends ClassLoaderHook implements BundleFileWrapperFa
CDSBundleFile hostFile = getCDSBundleFile(hostmanager.getGeneration().getBundleFile());
CDSBundleFile sourceFile = getCDSBundleFile(sourceGeneration.getBundleFile());
if ((hostFile != sourceFile) && (null != hostFile) && (null != sourceFile)) {
- // set the helper that got set on the host base bundle file in initializedClassLoader
+ // Set the helper that got set on the host base bundle file in classLoaderCreated.
+ // This is to handle the case where fragments are dynamically attached
SharedClassURLHelper urlHelper = hostFile.getURLHelper();
sourceFile.setURLHelper(urlHelper);
+ sourceFile.setPrimed(hostFile.getPrimed());
}
return false;

Back to the top