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 2010/12/22 16:01:39 UTC

svn commit: r1051936 - /felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java

Author: rickhall
Date: Wed Dec 22 15:01:39 2010
New Revision: 1051936

URL: http://svn.apache.org/viewvc?rev=1051936&view=rev
Log:
Optimize resolver to not re-calculate "uses" constraints for already
resolved modules. (FELIX-2737)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java?rev=1051936&r1=1051935&r2=1051936&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java Wed Dec 22 15:01:39 2010
@@ -542,6 +542,7 @@ public class ResolverImpl implements Res
         // the module is resolved or not.
         List<Requirement> reqs = new ArrayList();
         List<Capability> caps = new ArrayList();
+        boolean isDynamicImport = false;
         if (module.isResolved())
         {
             // Use wires to get actual requirements and satisfying capabilities.
@@ -567,6 +568,7 @@ public class ResolverImpl implements Res
                 Capability cap = candCaps.iterator().next();
                 reqs.add(req);
                 caps.add(cap);
+                isDynamicImport = true;
                 // Can only dynamically import one at a time, so break
                 // out of the loop after the first.
                 break;
@@ -614,12 +616,38 @@ public class ResolverImpl implements Res
         // Fourth, if the target module is unresolved or is dynamically importing,
         // then add all the uses constraints implied by its imported and required
         // packages to its package space.
-        for (Entry<String, List<Blame>> entry : modulePkgs.m_importedPkgs.entrySet())
+        // NOTE: We do not need to do this for resolved modules because their
+        // package space is consistent by definition and these uses constraints
+        // are only needed to verify the consistency of a resolving module. The
+        // only exception is if a resolve module is dynamically importing, then
+        // we need to calculate its uses constraints again to make sure the new
+        // import is consistent with the existing package space.
+        if (!module.isResolved() || isDynamicImport)
         {
-            for (Blame blame : entry.getValue())
+            for (Entry<String, List<Blame>> entry : modulePkgs.m_importedPkgs.entrySet())
+            {
+                for (Blame blame : entry.getValue())
+                {
+                    // Ignore modules that import from themselves.
+                    if (!blame.m_cap.getModule().equals(module))
+                    {
+                        List<Requirement> blameReqs = new ArrayList();
+                        blameReqs.add(blame.m_reqs.get(0));
+
+                        mergeUses(
+                            module,
+                            modulePkgs,
+                            blame.m_cap,
+                            blameReqs,
+                            modulePkgMap,
+                            candidateMap,
+                            usesCycleMap);
+                    }
+                }
+            }
+            for (Entry<String, List<Blame>> entry : modulePkgs.m_requiredPkgs.entrySet())
             {
-                // Ignore modules that import from themselves.
-                if (!blame.m_cap.getModule().equals(module))
+                for (Blame blame : entry.getValue())
                 {
                     List<Requirement> blameReqs = new ArrayList();
                     blameReqs.add(blame.m_reqs.get(0));
@@ -635,23 +663,6 @@ public class ResolverImpl implements Res
                 }
             }
         }
-        for (Entry<String, List<Blame>> entry : modulePkgs.m_requiredPkgs.entrySet())
-        {
-            for (Blame blame : entry.getValue())
-            {
-                List<Requirement> blameReqs = new ArrayList();
-                blameReqs.add(blame.m_reqs.get(0));
-
-                mergeUses(
-                    module,
-                    modulePkgs,
-                    blame.m_cap,
-                    blameReqs,
-                    modulePkgMap,
-                    candidateMap,
-                    usesCycleMap);
-            }
-        }
     }
 
     private void mergeCandidatePackages(