FELIX-4223 access m_activated more usually under a lock
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1523552 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index d95b721..5140c03 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -823,34 +823,32 @@
final void disposeInternal( int reason )
{
log( LogService.LOG_DEBUG, "Disposing component (reason: " + reason + ")", null );
- if ( m_activated )
- {
- doDeactivate( reason, true );
- }
+ doDeactivate( reason, true );
clear();
}
- void doDeactivate( int reason, boolean disable )
+ final void doDeactivate( int reason, boolean disable )
{
try
{
if ( !unregisterService() )
{
log( LogService.LOG_DEBUG, "Component deactivation occuring on another thread", null );
- //another thread is deactivating.
- return;
}
obtainWriteLock( "AbstractComponentManager.State.doDeactivate.1" );
try
{
- m_activated = false;
- deleteComponent( reason );
- deactivateDependencyManagers();
- if ( disable )
+ if ( m_activated )
{
- disableDependencyManagers();
+ m_activated = false;
+ deleteComponent( reason );
+ deactivateDependencyManagers();
+ if ( disable )
+ {
+ disableDependencyManagers();
+ }
+ unsetDependenciesCollected();
}
- unsetDependenciesCollected();
}
finally
{
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
index 54f05b2..3f31f3b 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
@@ -81,6 +81,7 @@
((AbstractComponentManager)i.next()).enable( false );
}
+ m_activated = true;
return true;
}
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index fc872dd..4f09836 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -572,6 +572,17 @@
m_properties = null;
+ // reactivate the component to ensure it is provided with the
+ // configuration data
+ if ( ( getState() & ( STATE_DISPOSED | STATE_DISABLED ) ) != 0 )
+ {
+ // nothing to do for inactive components, leave this method
+ log( LogService.LOG_DEBUG, "Component can not be configured in state {0}", new Object[] { getState() }, null );
+ //m_internalEnabled is false, we don't need to worry about activation
+ updateTargets( getProperties() );
+ return;
+ }
+
//TODO wait for activation/deactivation to complete, then lock(?) or internal disable...
// unsatisfied component and non-ignored configuration may change targets
@@ -594,17 +605,6 @@
return;
}
- // reactivate the component to ensure it is provided with the
- // configuration data
- if ( ( getState() & ( STATE_DISPOSED | STATE_DISABLED ) ) != 0 )
- {
- // nothing to do for inactive components, leave this method
- log( LogService.LOG_DEBUG, "Component can not be configured in state {0}", new Object[] { getState() }, null );
- //m_internalEnabled is false, we don't need to worry about activation
- updateTargets( getProperties() );
- return;
- }
-
// if the configuration has been deleted but configuration is required
// this component must be deactivated
if ( configuration == null && getComponentMetadata().isConfigurationRequired() )