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 2015/01/15 18:17:26 UTC
svn commit: r1652174 -
/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
Author: rickhall
Date: Thu Jan 15 17:17:25 2015
New Revision: 1652174
URL: http://svn.apache.org/r1652174
Log:
Apply patch (FELIX-4762) to eliminate excessive memory consumption when
resolving some require-bundle scenarios.
Modified:
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
Modified: felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java?rev=1652174&r1=1652173&r2=1652174&view=diff
==============================================================================
--- felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java (original)
+++ felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java Thu Jan 15 17:17:25 2015
@@ -732,7 +732,7 @@ public class ResolverImpl implements Res
mergeCandidatePackages(
session.getContext(), resource, req, cap, resourcePkgMap, allCandidates,
- new HashMap<Resource, List<Capability>>());
+ new HashMap<Resource, List<Capability>>(), new HashMap<Resource, List<Resource>>());
}
// Third, have all candidates to calculate their package spaces.
@@ -829,7 +829,7 @@ public class ResolverImpl implements Res
private void mergeCandidatePackages(
ResolveContext rc, Resource current, Requirement currentReq,
Capability candCap, Map<Resource, Packages> resourcePkgMap,
- Candidates allCandidates, Map<Resource, List<Capability>> cycles)
+ Candidates allCandidates, Map<Resource, List<Capability>> cycles, HashMap<Resource, List<Resource>> visitedRequiredBundlesMap)
{
List<Capability> cycleCaps = cycles.get(current);
if (cycleCaps == null)
@@ -858,16 +858,27 @@ public class ResolverImpl implements Res
// will be visible to the current resource.
Packages candPkgs = resourcePkgMap.get(candCap.getResource());
- // We have to merge all exported packages from the candidate,
- // since the current resource requires it.
- for (Entry<String, Blame> entry : candPkgs.m_exportedPkgs.entrySet())
- {
- mergeCandidatePackage(
- current,
- true,
- currentReq,
- entry.getValue().m_cap,
- resourcePkgMap);
+ List<Resource> visitedRequiredBundles = visitedRequiredBundlesMap.get(current);
+ if (visitedRequiredBundles == null)
+ {
+ visitedRequiredBundles = new ArrayList<Resource>();
+ visitedRequiredBundlesMap.put(current, visitedRequiredBundles);
+ }
+ if (!visitedRequiredBundles.contains(candCap.getResource()))
+ {
+ visitedRequiredBundles.add(candCap.getResource());
+
+ // We have to merge all exported packages from the candidate,
+ // since the current resource requires it.
+ for (Entry<String, Blame> entry : candPkgs.m_exportedPkgs.entrySet())
+ {
+ mergeCandidatePackage(
+ current,
+ true,
+ currentReq,
+ entry.getValue().m_cap,
+ resourcePkgMap);
+ }
}
// If the candidate requires any other bundles with reexport visibility,
@@ -893,7 +904,7 @@ public class ResolverImpl implements Res
w.getCapability(),
resourcePkgMap,
allCandidates,
- cycles);
+ cycles, visitedRequiredBundlesMap);
}
}
}
@@ -918,7 +929,7 @@ public class ResolverImpl implements Res
allCandidates.getCandidates(req).iterator().next(),
resourcePkgMap,
allCandidates,
- cycles);
+ cycles, visitedRequiredBundlesMap);
}
}
}