Author: djencks
Date: Tue Oct 29 18:44:14 2013
New Revision: 1536844

URL: http://svn.apache.org/r1536844
Log:
FELIX-4297 Make sure that all EdgeInfos are completely unlocked before a failed 
activation attempt is abandoned

Modified:
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java?rev=1536844&r1=1536843&r2=1536844&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java 
(original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java 
Tue Oct 29 18:44:14 2013
@@ -121,6 +121,14 @@ class EdgeInfo
     {
         this.open = open;
     }
+    
+    public void ignore()
+    {
+        open = Integer.MAX_VALUE;
+        close = Integer.MAX_VALUE - 1;
+        openLatch.countDown();
+        closeLatch.countDown();
+    }
 
     public boolean outOfRange( int trackingCount )
     {

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java?rev=1536844&r1=1536843&r2=1536844&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
 Tue Oct 29 18:44:14 2013
@@ -266,34 +266,47 @@ public class SingleComponentManager<S> e
 
         // 4. Bind the target services
 
+        DependencyManager<S, ?> failedDm = null;
         for ( DependencyManager<S, ?> dm: getDependencyManagers())
         {
-            // if a dependency turned unresolved since the validation check,
-            // creating the instance fails here, so we deactivate and return
-            // null.
-            boolean open = dm.open( implementationObject, 
componentContext.getEdgeInfo( dm ) );
-            if ( !open )
-            {
-                log( LogService.LOG_ERROR, "Cannot create component instance 
due to failure to bind reference {0}",
-                        new Object[]
-                                {dm.getName()}, null );
-
-                // make sure, we keep no bindings. Only close the dm's we 
opened.
-                boolean skip = true;
-                for ( DependencyManager md: getReversedDependencyManagers() )
+            if ( failedDm == null )
+            {
+                // if a dependency turned unresolved since the validation 
check,
+                // creating the instance fails here, so we deactivate and 
return
+                // null.
+                boolean open = dm.open( implementationObject, 
componentContext.getEdgeInfo( dm ) );
+                if ( !open )
                 {
-                    if ( skip && dm == md ) {
-                        skip = false;
-                    }
-                    if ( !skip )
-                    {
-                        md.close( implementationObject, 
componentContext.getEdgeInfo( md ) );
-                    }
-                }
+                    log( LogService.LOG_ERROR, "Cannot create component 
instance due to failure to bind reference {0}",
+                            new Object[] { dm.getName() }, null );
+
+                    failedDm = dm;
 
-                setter.resetImplementationObject( implementationObject );
-                return null;
+                }
+            }
+            else
+            {
+                componentContext.getEdgeInfo( dm ).ignore();
+            }
+        }
+        if (failedDm != null)
+        {
+            // make sure, we keep no bindings. Only close the dm's we opened.
+            boolean skip = true;
+            for ( DependencyManager md: getReversedDependencyManagers() )
+            {
+                if ( skip && failedDm == md )
+                {
+                    skip = false;
+                }
+                if ( !skip )
+                {
+                    md.close( implementationObject, 
componentContext.getEdgeInfo( md ) );
+                }
             }
+            setter.resetImplementationObject( implementationObject );
+            return null;
+
         }
 
         // 5. Call the activate method, if present


Reply via email to