You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dj...@apache.org on 2015/09/11 16:58:18 UTC
svn commit: r1702489 -
/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
Author: djencks
Date: Fri Sep 11 14:58:18 2015
New Revision: 1702489
URL: http://svn.apache.org/r1702489
Log:
FELIX-4984 fix some circular reference problems
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java?rev=1702489&r1=1702488&r2=1702489&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java Fri Sep 11 14:58:18 2015
@@ -383,6 +383,7 @@ public class DependencyManager<S, T> imp
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 @@ public class DependencyManager<S, T> imp
}
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 @@ public class DependencyManager<S, T> imp
{
serviceCount++;
}
- else
- {
- m_componentManager.registerMissingDependency( DependencyManager.this, refPair.getRef(),
- trackingCount.get() );
- }
}
return cardinalitySatisfied( serviceCount );
}
@@ -734,7 +738,7 @@ public class DependencyManager<S, T> imp
closeRefPair();
}
}
- else
+ else if ( cardinalitySatisfied( 0 ) )
{
m_componentManager.registerMissingDependency( DependencyManager.this, serviceReference,
trackingCount );
@@ -866,7 +870,7 @@ public class DependencyManager<S, T> imp
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 @@ public class DependencyManager<S, T> imp
}
//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)
// {