Author: tjwatson
Date: Fri Jan 25 14:30:58 2019
New Revision: 1852138

URL: http://svn.apache.org/viewvc?rev=1852138&view=rev
Log:
FELIX-6036 - avoid stashing stale RefPair objects in OpenStatus

Modified:
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentConstructor.java
    
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/inject/ComponentConstructor.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentConstructor.java?rev=1852138&r1=1852137&r2=1852138&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentConstructor.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentConstructor.java
 Fri Jan 25 14:30:58 2019
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.felix.scr.impl.inject.ValueUtils.ValueType;
 import org.apache.felix.scr.impl.inject.field.FieldUtils;
@@ -267,7 +268,7 @@ public class ComponentConstructor<S>
                 {
                     final List<Object> refs = refMetadata.isMultiple() ? new 
ArrayList<>() : null;
                     Object ref = null;
-                    for(final RefPair<S, ?> refPair : status.refs)
+                    for(final RefPair<S, ?> refPair : status.getRefs(new 
AtomicInteger()))
                     {
                         if ( !refPair.isDeleted() && !refPair.isFailed() )
                         {

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=1852138&r1=1852137&r2=1852138&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 Jan 25 14:30:58 2019
@@ -1540,7 +1540,7 @@ public class DependencyManager<S, T> imp
 
     public ReferenceMetadata getReferenceMetadata()
     {
-       return m_dependencyMetadata;
+        return m_dependencyMetadata;
     }
 
     /**
@@ -1577,8 +1577,13 @@ public class DependencyManager<S, T> imp
     }
 
     public static final class OpenStatus<S, T> {
-        public final AtomicInteger trackingCount = new AtomicInteger();
-        public Collection<RefPair<S, T>> refs;
+        private final DependencyManager<S, T> dm;
+        OpenStatus(DependencyManager<S, T> dm) {
+            this.dm = dm;
+        }
+        public Collection<RefPair<S, T>> getRefs(AtomicInteger trackingCount) {
+            return dm.m_customizer.getRefs(trackingCount);
+        }
     }
 
     /**
@@ -1592,17 +1597,19 @@ public class DependencyManager<S, T> imp
     OpenStatus<S, T> open(ComponentContextImpl<S> componentContext, EdgeInfo 
edgeInfo)
     {
         int serviceCount = 0;
-        final OpenStatus<S, T> status = new OpenStatus<>();
+        final OpenStatus<S, T> status = new OpenStatus<>(this);
+        Collection<RefPair<S, T>> refs;
+        AtomicInteger trackingCount = new AtomicInteger();
         CountDownLatch openLatch;
         synchronized (m_tracker.tracked())
         {
-               status.refs = m_customizer.getRefs(status.trackingCount);
-            edgeInfo.setOpen(status.trackingCount.get());
+            refs = m_customizer.getRefs(trackingCount);
+            edgeInfo.setOpen(trackingCount.get());
             openLatch = edgeInfo.getOpenLatch();
         }
         m_componentManager.getLogger().log(LogService.LOG_DEBUG, "For 
dependency {0}, optional: {1}; to bind: {2}",
-                null, getName(), isOptional(), status.refs);
-        for (RefPair<S, T> refPair : status.refs)
+                null, getName(), isOptional(), refs);
+        for (RefPair<S, T> refPair : refs)
         {
             if (!refPair.isDeleted() && !refPair.isFailed())
             {
@@ -1630,11 +1637,12 @@ public class DependencyManager<S, T> imp
             final OpenStatus<S, T> status)
     {
         int serviceCount = 0;
-        for (final RefPair<S, T> refPair : status.refs)
+        AtomicInteger trackingCount = new AtomicInteger();
+        for (final RefPair<S, T> refPair : status.getRefs(trackingCount))
         {
             if (!refPair.isDeleted() && !refPair.isFailed())
             {
-                if (!doInvokeBindMethod(componentContext, bindMethod, refPair, 
status.trackingCount.get()))
+                if (!doInvokeBindMethod(componentContext, bindMethod, refPair, 
trackingCount.get()))
                 {
                     m_componentManager.getLogger().log(LogService.LOG_DEBUG,
                         "For dependency {0}, failed to invoke bind method on 
object {1}",


Reply via email to