FELIX-4297 Make sure that all EdgeInfos are completely unlocked before a failed activation attempt is abandoned
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1536844 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
index 80a48dc..66a2a62 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
@@ -121,6 +121,14 @@
{
this.open = open;
}
+
+ public void ignore()
+ {
+ open = Integer.MAX_VALUE;
+ close = Integer.MAX_VALUE - 1;
+ openLatch.countDown();
+ closeLatch.countDown();
+ }
public boolean outOfRange( int trackingCount )
{
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
index dc72b8c..0838bb2 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
@@ -266,34 +266,47 @@
// 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 )
+ if ( failedDm == null )
{
- 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 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 );
- setter.resetImplementationObject( implementationObject );
- return null;
+ failedDm = dm;
+
+ }
}
+ 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