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