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