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 2009/04/23 10:34:42 UTC

svn commit: r767850 - /felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java

Author: rickhall
Date: Thu Apr 23 08:34:41 2009
New Revision: 767850

URL: http://svn.apache.org/viewvc?rev=767850&view=rev
Log:
Need to double-check wires for dynamic imports because it is possible
that threads can race to concurrently create dynamically imported wires.
This ensures that the second thread will see the wire created by the
first thread. (FELIX-1027)

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

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=767850&r1=767849&r2=767850&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java Thu Apr 23 08:34:41 2009
@@ -3716,6 +3716,19 @@
 
                 try
                 {
+                    // Double check to make sure that someone hasn't beaten us to
+                    // dynamically importing the package, which can happen if two
+                    // threads are racing to do so. If we have an existing wire,
+                    // then just return it instead.
+                    IWire[] wires = importer.getWires();
+                    for (int i = 0; (wires != null) && (i < wires.length); i++)
+                    {
+                        if (wires[i].hasPackage(pkgName))
+                        {
+                            return wires[i];
+                        }
+                    }
+
                     Object[] result = m_resolver.resolveDynamicImport(m_resolverState, importer, pkgName);
                     if (result != null)
                     {
@@ -3728,7 +3741,7 @@
                         // Dynamically add new wire to importing module.
                         if (candidateWire != null)
                         {
-                            IWire[] wires = importer.getWires();
+                            wires = importer.getWires();
                             IWire[] newWires = null;
                             if (wires == null)
                             {