You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dj...@apache.org on 2012/08/09 18:18:16 UTC
svn commit: r1371285 - in
/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl: config/ manager/
Author: djencks
Date: Thu Aug 9 16:18:16 2012
New Revision: 1371285
URL: http://svn.apache.org/viewvc?rev=1371285&view=rev
Log:
FELIX-3456 only obtain read lock once to avoid problems with reentrancy
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java?rev=1371285&r1=1371284&r2=1371285&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java Thu Aug 9 16:18:16 2012
@@ -188,14 +188,17 @@ public class ImmediateComponentHolder im
if ( pid.equals( getComponentMetadata().getConfigurationPid() ) )
{
// singleton configuration deleted
- m_singleComponent.obtainReadLock();
+ final boolean release = m_singleComponent.obtainReadLock();
try
{
m_singleComponent.reconfigure( null );
}
finally
{
- m_singleComponent.releaseReadLock();
+ if ( release )
+ {
+ m_singleComponent.releaseReadLock();
+ }
}
}
else
@@ -205,7 +208,7 @@ public class ImmediateComponentHolder im
if ( icm != null )
{
boolean dispose = true;
- icm.obtainReadLock();
+ final boolean release = icm.obtainReadLock();
try
{
// special casing if the single component is deconfigured
@@ -242,7 +245,10 @@ public class ImmediateComponentHolder im
}
finally
{
- icm.releaseReadLock();
+ if ( release )
+ {
+ icm.releaseReadLock();
+ }
}
}
}
@@ -271,7 +277,7 @@ public class ImmediateComponentHolder im
if ( pid.equals( getComponentMetadata().getConfigurationPid() ) )
{
- m_singleComponent.obtainReadLock();
+ final boolean release = m_singleComponent.obtainReadLock();
try
{
// singleton configuration has pid equal to component name
@@ -279,7 +285,10 @@ public class ImmediateComponentHolder im
}
finally
{
- m_singleComponent.releaseReadLock();
+ if ( release )
+ {
+ m_singleComponent.releaseReadLock();
+ }
}
}
else
@@ -288,7 +297,7 @@ public class ImmediateComponentHolder im
final ImmediateComponentManager icm = getComponentManager( pid );
if ( icm != null )
{
- icm.obtainReadLock();
+ final boolean release = icm.obtainReadLock();
try
{
// factory configuration updated for existing component instance
@@ -296,7 +305,10 @@ public class ImmediateComponentHolder im
}
finally
{
- icm.releaseReadLock();
+ if ( release )
+ {
+ icm.releaseReadLock();
+ }
}
}
else
@@ -315,14 +327,17 @@ public class ImmediateComponentHolder im
}
// configure the component
- newIcm.obtainReadLock();
+ final boolean release = newIcm.obtainReadLock();
try
{
newIcm.reconfigure( props );
}
finally
{
- newIcm.releaseReadLock();
+ if ( release )
+ {
+ newIcm.releaseReadLock();
+ }
}
// enable the component if it is initially enabled
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1371285&r1=1371284&r2=1371285&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java Thu Aug 9 16:18:16 2012
@@ -149,9 +149,14 @@ public abstract class AbstractComponentM
}
//ImmediateComponentHolder should be in this manager package and this should be default access.
- public final void obtainReadLock()
+ public final boolean obtainReadLock()
{
// new Exception("Stack trace obtainReadLock").printStackTrace();
+ if (m_stateLock.getReadHoldCount() >0)
+ {
+ return false;
+// throw new IllegalStateException( "nested read locks" );
+ }
try
{
if (!m_stateLock.tryReadLock( m_timeout ) )
@@ -164,6 +169,7 @@ public abstract class AbstractComponentM
//TODO this is so wrong
throw new IllegalStateException( "Could not obtain lock (Reason: " + e + ")" );
}
+ return true;
}
@@ -256,7 +262,7 @@ public abstract class AbstractComponentM
public final void enable( final boolean async )
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
enableInternal();
@@ -267,7 +273,10 @@ public abstract class AbstractComponentM
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
if ( async )
@@ -276,14 +285,17 @@ public abstract class AbstractComponentM
{
public void run()
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
activateInternal();
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
} );
@@ -304,7 +316,7 @@ public abstract class AbstractComponentM
public final void disable( final boolean async )
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
if ( !async )
@@ -315,7 +327,10 @@ public abstract class AbstractComponentM
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
if ( async )
@@ -324,14 +339,17 @@ public abstract class AbstractComponentM
{
public void run()
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
deactivateInternal( ComponentConstants.DEACTIVATION_REASON_DISABLED );
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
} );
@@ -362,14 +380,17 @@ public abstract class AbstractComponentM
*/
public void dispose( int reason )
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
disposeInternal( reason );
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java?rev=1371285&r1=1371284&r2=1371285&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java Thu Aug 9 16:18:16 2012
@@ -94,7 +94,7 @@ public class ComponentFactoryImpl extend
final ImmediateComponentManager cm = createComponentManager();
ComponentInstance instance;
- cm.obtainReadLock();
+ final boolean release = cm.obtainReadLock();
try
{
cm.setFactoryProperties( dictionary );
@@ -108,13 +108,16 @@ public class ComponentFactoryImpl extend
if ( instance == null )
{
// activation failed, clean up component manager
- cm.dispose();
+ cm.disposeInternal( ComponentConstants.DEACTIVATION_REASON_DISPOSED );
throw new ComponentException( "Failed activating component" );
}
}
finally
{
- cm.releaseReadLock();
+ if ( release )
+ {
+ cm.releaseReadLock();
+ }
}
synchronized ( m_componentInstances )
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java?rev=1371285&r1=1371284&r2=1371285&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java Thu Aug 9 16:18:16 2012
@@ -139,7 +139,7 @@ public class ConfigurationComponentFacto
}
else //non-spec backwards compatible
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
ImmediateComponentManager cm;
@@ -178,20 +178,26 @@ public class ConfigurationComponentFacto
{
// update the configuration as if called as ManagedService
//TODO deadlock potential, we are holding our own state lock.
- cm.obtainReadLock();
+ final boolean releaseInner = cm.obtainReadLock();
try
{
cm.reconfigure( configuration );
}
finally
{
- cm.releaseReadLock();
+ if ( releaseInner )
+ {
+ cm.releaseReadLock();
+ }
}
}
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
}
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=1371285&r1=1371284&r2=1371285&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 Thu Aug 9 16:18:16 2012
@@ -155,7 +155,7 @@ public class DependencyManager implement
final ServiceReference ref = event.getServiceReference();
final String serviceString = "Service " + m_dependencyMetadata.getInterface() + "/"
+ ref.getProperty( Constants.SERVICE_ID );
- m_componentManager.obtainReadLock();
+ final boolean release = m_componentManager.obtainReadLock();
try
{
switch ( event.getType() )
@@ -258,7 +258,10 @@ public class DependencyManager implement
}
finally
{
- m_componentManager.releaseReadLock();
+ if ( release )
+ {
+ m_componentManager.releaseReadLock();
+ }
}
}
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java?rev=1371285&r1=1371284&r2=1371285&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java Thu Aug 9 16:18:16 2012
@@ -617,7 +617,7 @@ public class ImmediateComponentManager e
public Object getService( Bundle bundle, ServiceRegistration serviceRegistration )
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
if ( m_useCount == 0 )
@@ -641,13 +641,16 @@ public class ImmediateComponentManager e
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
public void ungetService( Bundle bundle, ServiceRegistration serviceRegistration, Object o )
{
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
// the framework should not call ungetService more than it calls
@@ -678,7 +681,10 @@ public class ImmediateComponentManager e
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
}
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java?rev=1371285&r1=1371284&r2=1371285&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Thu Aug 9 16:18:16 2012
@@ -95,7 +95,7 @@ public class ServiceFactoryComponentMana
// When the getServiceMethod is called, the implementation object must be created
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
// private ComponentContext and implementation instances
@@ -126,7 +126,10 @@ public class ServiceFactoryComponentMana
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}
@@ -139,7 +142,7 @@ public class ServiceFactoryComponentMana
log( LogService.LOG_DEBUG, "ServiceFactory.ungetService()", null );
// When the ungetServiceMethod is called, the implementation object must be deactivated
- obtainReadLock();
+ final boolean release = obtainReadLock();
try
{
// private ComponentContext and implementation instances
@@ -156,7 +159,10 @@ public class ServiceFactoryComponentMana
}
finally
{
- releaseReadLock();
+ if ( release )
+ {
+ releaseReadLock();
+ }
}
}