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}",