diff options
author | Thomas Watson | 2009-07-07 21:30:39 +0000 |
---|---|---|
committer | Thomas Watson | 2009-07-07 21:30:39 +0000 |
commit | 6e2816461b9dfa5d8ba84b3f22cab346543b54ad (patch) | |
tree | 871295b6ad61f354bde6fb111757430b2566c63a | |
parent | 15b86fa636ce6148daace59bb254c369d1cfbc60 (diff) | |
download | rt.equinox.framework-6e2816461b9dfa5d8ba84b3f22cab346543b54ad.tar.gz rt.equinox.framework-6e2816461b9dfa5d8ba84b3f22cab346543b54ad.tar.xz rt.equinox.framework-6e2816461b9dfa5d8ba84b3f22cab346543b54ad.zip |
Deadlock possible between refreshPackages and BundleLoader initialization
-rw-r--r-- | bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/PackageAdminImpl.java | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/PackageAdminImpl.java b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/PackageAdminImpl.java index a675e924c..0457ccfb6 100644 --- a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/PackageAdminImpl.java +++ b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/PackageAdminImpl.java @@ -202,17 +202,17 @@ public class PackageAdminImpl implements PackageAdmin { framework.publishBundleEvent(Framework.BATCHEVENT_BEGIN, framework.systemBundle); State systemState = framework.adaptor.getState(); BundleDescription[] descriptions = null; - synchronized (framework.bundles) { - int numBundles = bundles == null ? 0 : bundles.length; - if (!refreshPackages) - // in this case we must make descriptions non-null so we do - // not force the removal pendings to be processed when resolving - // the state. - descriptions = new BundleDescription[0]; - else if (numBundles > 0) { - // populate the resolved hosts package sources first - populateLoaders(framework.bundles.getBundles()); - // not collect the descriptions to refresh + int numBundles = bundles == null ? 0 : bundles.length; + if (!refreshPackages) + // in this case we must make descriptions non-null so we do + // not force the removal pendings to be processed when resolving + // the state. + descriptions = new BundleDescription[0]; + else if (numBundles > 0) { + // populate the resolved hosts package sources first (do this outside sync block: bug 280929) + populateLoaders(framework.getAllBundles()); + synchronized (framework.bundles) { + // now collect the descriptions to refresh ArrayList results = new ArrayList(numBundles); BundleDelta[] addDeltas = null; for (int i = 0; i < numBundles; i++) { @@ -259,15 +259,14 @@ public class PackageAdminImpl implements PackageAdmin { } } - private void populateLoaders(List bundles) { + private void populateLoaders(AbstractBundle[] bundles) { // populate all the loaders with their package source information // this is needed to fix bug 259903. - for (Iterator iBundles = bundles.listIterator(); iBundles.hasNext();) { - AbstractBundle bundle = (AbstractBundle) iBundles.next(); + for (int i = 0; i < bundles.length; i++) { // only need to do this for host bundles which are resolved - if (bundle instanceof BundleHost && bundle.isResolved()) { + if (bundles[i] instanceof BundleHost && bundles[i].isResolved()) { // getting the BundleLoader object populates the require-bundle sources - BundleLoader loader = ((BundleHost) bundle).getBundleLoader(); + BundleLoader loader = ((BundleHost) bundles[i]).getBundleLoader(); if (loader != null) // need to explicitly get the import package sources loader.getImportedSources(null); |