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)
                             {


Reply via email to