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)
 //        {