FELIX-1733 Prevent recreation of dead components when the components
of a ConfiguredComponentHolder have to be disposed off
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@824123 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java
index 2e88527..49e729d 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java
@@ -264,10 +264,15 @@
public void disposeComponents( final int reason )
{
+ // FELIX-1733: get a copy of the single component and clear
+ // the field to prevent recreation in disposed(ICM)
+ final ImmediateComponentManager singleComponent = m_singleComponent;
+ m_singleComponent = null;
+
final ImmediateComponentManager[] cms = getComponentManagers( true );
if ( cms == null )
{
- m_singleComponent.dispose( reason );
+ singleComponent.dispose( reason );
}
else
{
@@ -284,12 +289,15 @@
// ensure the component is removed from the components map
synchronized ( m_components )
{
- for ( Iterator vi = m_components.values().iterator(); vi.hasNext(); )
+ if ( !m_components.isEmpty() )
{
- if ( component == vi.next() )
+ for ( Iterator vi = m_components.values().iterator(); vi.hasNext(); )
{
- vi.remove();
- break;
+ if ( component == vi.next() )
+ {
+ vi.remove();
+ break;
+ }
}
}
}