FELIX-4984 fix some circular reference problems
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1702489 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index a668e1d..cbf0ed0 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -383,6 +383,7 @@
int serviceCount = 0;
AtomicInteger trackingCount = new AtomicInteger( );
SortedMap<ServiceReference<T>, RefPair<S, T>> tracked = getTracker().getTracked( true, trackingCount );
+ List<RefPair<S,T>> failed = new ArrayList<RefPair<S, T>>();
for (RefPair<S, T> refPair: tracked.values())
{
if (getServiceObject( key, m_bindMethods.getBind(), refPair ))
@@ -391,10 +392,18 @@
}
else
{
- m_componentManager.registerMissingDependency( DependencyManager.this, refPair.getRef(), trackingCount.get() );
+ failed.add(refPair);
}
}
- return cardinalitySatisfied( serviceCount );
+ if ( cardinalitySatisfied( serviceCount ) )
+ {
+ for ( RefPair<S, T> refPair: failed)
+ {
+ m_componentManager.registerMissingDependency( DependencyManager.this, refPair.getRef(), trackingCount.get() );
+ }
+ return true;
+ }
+ return false;
}
public void close()
@@ -522,11 +531,6 @@
{
serviceCount++;
}
- else
- {
- m_componentManager.registerMissingDependency( DependencyManager.this, refPair.getRef(),
- trackingCount.get() );
- }
}
return cardinalitySatisfied( serviceCount );
}
@@ -734,7 +738,7 @@
closeRefPair();
}
}
- else
+ else if ( cardinalitySatisfied( 0 ) )
{
m_componentManager.registerMissingDependency( DependencyManager.this, serviceReference,
trackingCount );
@@ -866,7 +870,7 @@
if (refPair != null)
{
success |= getServiceObject( key, m_bindMethods.getBind(), refPair );
- if ( refPair.isFailed() )
+ if ( refPair.isFailed() && cardinalitySatisfied( 0 ))
{
m_componentManager.registerMissingDependency( DependencyManager.this, refPair.getRef(),
trackingCount.get() );
@@ -1561,6 +1565,9 @@
}
//TODO dynamic reluctant
RefPair<S, T> refPair = m_tracker.getService( ref );
+ if (refPair == null) {
+ return; // The service is no longer available, probably because the tracker has been closed
+ }
//TODO this check is no longer correct, fix it!
// if (refPair.getServiceObject(key) != null)
// {