You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2011/07/20 22:16:28 UTC
svn commit: r1148927 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework:
BundleRevisionDependencies.java StatefulResolver.java
Author: rickhall
Date: Wed Jul 20 20:16:28 2011
New Revision: 1148927
URL: http://svn.apache.org/viewvc?rev=1148927&view=rev
Log:
Handle dependencies a little differently to avoid dangling references and
make sure to use the revision, not the wiring, to clean up dependencies. (FELIX-2950)
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionDependencies.java
felix/trunk/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionDependencies.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionDependencies.java?rev=1148927&r1=1148926&r2=1148927&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionDependencies.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionDependencies.java Wed Jul 20 20:16:28 2011
@@ -138,14 +138,17 @@ class BundleRevisionDependencies
// get the capability list from the revision's wiring, which is
// in declared order (including fragments), and use it to create
// the provided wire list in declared order.
- List<BundleCapability> resolvedCaps =
- revision.getWiring().getCapabilities(namespace);
- for (BundleCapability resolvedCap : resolvedCaps)
+ BundleWiring wiring = revision.getWiring();
+ if (wiring != null)
{
- Set<BundleWire> dependentWires = providedCaps.get(resolvedCap);
- if (dependentWires != null)
+ List<BundleCapability> resolvedCaps = wiring.getCapabilities(namespace);
+ for (BundleCapability resolvedCap : resolvedCaps)
{
- providedWires.addAll(dependentWires);
+ Set<BundleWire> dependentWires = providedCaps.get(resolvedCap);
+ if (dependentWires != null)
+ {
+ providedWires.addAll(dependentWires);
+ }
}
}
}
@@ -164,11 +167,12 @@ class BundleRevisionDependencies
// since their dependents are their hosts.
if (Util.isFragment(revision))
{
- if (revision.getWiring() != null)
+ BundleWiring wiring = revision.getWiring();
+ if (wiring != null)
{
- for (BundleWire wire : revision.getWiring().getRequiredWires(null))
+ for (BundleWire bw : wiring.getRequiredWires(null))
{
- result.add(wire.getProviderWiring().getBundle());
+ result.add(((BundleWireImpl) bw).getProvider().getBundle());
}
}
}
@@ -278,37 +282,33 @@ class BundleRevisionDependencies
BundleWiring wiring = rev.getWiring();
if (wiring != null)
{
- for (BundleWire wire : wiring.getRequiredWires(null))
+ for (BundleWire bw : wiring.getRequiredWires(null))
{
- // The provider wiring may already be null if the framework
- // is shutting down, so don't worry about updating dependencies
- // in that case.
- if (wire.getProviderWiring() != null)
- {
- Map<BundleCapability, Set<BundleWire>> caps =
- m_dependentsMap.get(wire.getProviderWiring().getRevision());
- if (caps != null)
- {
- List<BundleCapability> gc = new ArrayList<BundleCapability>();
- for (Entry<BundleCapability, Set<BundleWire>> entry
- : caps.entrySet())
- {
- entry.getValue().remove(wire);
- if (entry.getValue().isEmpty())
- {
- gc.add(entry.getKey());
- }
- }
- for (BundleCapability cap : gc)
+// TODO: OSGi R4.4 - Eventually we won't need to use the impl type here,
+// since the plan is to standardize on this method for the OBR spec.
+ Map<BundleCapability, Set<BundleWire>> caps =
+ m_dependentsMap.get(((BundleWireImpl) bw).getProvider());
+ if (caps != null)
+ {
+ List<BundleCapability> gc = new ArrayList<BundleCapability>();
+ for (Entry<BundleCapability, Set<BundleWire>> entry
+ : caps.entrySet())
+ {
+ entry.getValue().remove(bw);
+ if (entry.getValue().isEmpty())
{
- caps.remove(cap);
+ gc.add(entry.getKey());
}
- if (caps.isEmpty())
- {
+ }
+ for (BundleCapability cap : gc)
+ {
+ caps.remove(cap);
+ }
+ if (caps.isEmpty())
+ {
// TODO: OSGi R4.4 - Eventually we won't need to use the impl type here,
// since the plan is to standardize on this method for the OBR spec.
- m_dependentsMap.remove(((BundleWireImpl) wire).getProvider());
- }
+ m_dependentsMap.remove(((BundleWireImpl) bw).getProvider());
}
}
}
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java?rev=1148927&r1=1148926&r2=1148927&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java Wed Jul 20 20:16:28 2011
@@ -56,6 +56,7 @@ import org.osgi.framework.wiring.BundleC
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
class StatefulResolver
{
@@ -762,8 +763,6 @@ class StatefulResolver
rw.getCapability());
bundleWires.add(bw);
- m_felix.getDependencies().addDependent(bw);
-
if (Util.isFragment(revision))
{
m_felix.getLogger().log(
@@ -861,8 +860,15 @@ class StatefulResolver
BundleRevisionImpl revision = (BundleRevisionImpl) entry.getKey();
// Mark revision as resolved.
+ BundleWiring wiring = entry.getValue();
revision.resolve(entry.getValue());
+ // Record dependencies.
+ for (BundleWire bw : wiring.getRequiredWires(null))
+ {
+ m_felix.getDependencies().addDependent(bw);
+ }
+
// Update resolver state to remove substituted capabilities.
if (!Util.isFragment(revision))
{