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/24 22:13:08 UTC
svn commit: r1377081 - in
/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl: config/ manager/
Author: djencks
Date: Fri Aug 24 20:13:07 2012
New Revision: 1377081
URL: http://svn.apache.org/viewvc?rev=1377081&view=rev
Log:
FELIX-3456 track all locking activity to try to understand IllegalMonitorStateException on lock release
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=1377081&r1=1377080&r2=1377081&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 Fri Aug 24 20:13:07 2012
@@ -188,7 +188,7 @@ public class ImmediateComponentHolder im
if ( pid.equals( getComponentMetadata().getConfigurationPid() ) )
{
// singleton configuration deleted
- final boolean release = m_singleComponent.obtainReadLock();
+ final boolean release = m_singleComponent.obtainReadLock( "ImmediateComponentHolder.configurationDeleted.1" );
try
{
m_singleComponent.reconfigure( null );
@@ -197,7 +197,7 @@ public class ImmediateComponentHolder im
{
if ( release )
{
- m_singleComponent.releaseReadLock();
+ m_singleComponent.releaseReadLock( "ImmediateComponentHolder.configurationDeleted.1" );
}
}
}
@@ -208,7 +208,7 @@ public class ImmediateComponentHolder im
if ( icm != null )
{
boolean dispose = true;
- final boolean release = icm.obtainReadLock();
+ final boolean release = icm.obtainReadLock( "ImmediateComponentHolder.configurationDeleted.2" );
try
{
// special casing if the single component is deconfigured
@@ -247,7 +247,7 @@ public class ImmediateComponentHolder im
{
if ( release )
{
- icm.releaseReadLock();
+ icm.releaseReadLock( "ImmediateComponentHolder.configurationDeleted.2" );
}
}
}
@@ -277,7 +277,7 @@ public class ImmediateComponentHolder im
if ( pid.equals( getComponentMetadata().getConfigurationPid() ) )
{
- final boolean release = m_singleComponent.obtainReadLock();
+ final boolean release = m_singleComponent.obtainReadLock( "ImmediateComponentHolder.configurationUpdated.1" );
try
{
// singleton configuration has pid equal to component name
@@ -287,7 +287,7 @@ public class ImmediateComponentHolder im
{
if ( release )
{
- m_singleComponent.releaseReadLock();
+ m_singleComponent.releaseReadLock( "ImmediateComponentHolder.configurationUpdated.1" );
}
}
}
@@ -297,7 +297,7 @@ public class ImmediateComponentHolder im
final ImmediateComponentManager icm = getComponentManager( pid );
if ( icm != null )
{
- final boolean release = icm.obtainReadLock();
+ final boolean release = icm.obtainReadLock( "ImmediateComponentHolder.configurationUpdated.2" );
try
{
// factory configuration updated for existing component instance
@@ -307,7 +307,7 @@ public class ImmediateComponentHolder im
{
if ( release )
{
- icm.releaseReadLock();
+ icm.releaseReadLock( "ImmediateComponentHolder.configurationUpdated.2" );
}
}
}
@@ -327,7 +327,7 @@ public class ImmediateComponentHolder im
}
// configure the component
- final boolean release = newIcm.obtainReadLock();
+ final boolean release = newIcm.obtainReadLock( "ImmediateComponentHolder.configurationUpdated.3" );
try
{
newIcm.reconfigure( props );
@@ -336,7 +336,7 @@ public class ImmediateComponentHolder im
{
if ( release )
{
- newIcm.releaseReadLock();
+ newIcm.releaseReadLock( "ImmediateComponentHolder.configurationUpdated.3" );
}
}
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=1377081&r1=1377080&r2=1377081&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 Fri Aug 24 20:13:07 2012
@@ -101,6 +101,7 @@ public abstract class AbstractComponentM
private Thread lockingThread;
private Throwable lockingStackTrace;
+ private ArrayList lockingActivity = new ArrayList( );
/**
* The constructor receives both the activator and the metadata
@@ -157,8 +158,9 @@ public abstract class AbstractComponentM
}
//ImmediateComponentHolder should be in this manager package and this should be default access.
- public final boolean obtainReadLock()
+ public final boolean obtainReadLock( String source )
{
+ lockingActivity.add( "obtainReadLock from: " + source + " readLocks: " + m_stateLock.getReadHoldCount() + " writeLocks: " + m_stateLock.getWriteHoldCount() + " thread: " + Thread.currentThread() + " time: " + System.currentTimeMillis());
if (m_stateLock.getReadHoldCount() >0)
{
return false;
@@ -187,13 +189,28 @@ public abstract class AbstractComponentM
}
- public final void releaseReadLock()
+ public final void releaseReadLock( String source )
{
- m_stateLock.unlockReadLock();
+ lockingActivity.add( "releaseReadLock from: " + source + " readLocks: " + m_stateLock.getReadHoldCount() + " writeLocks: " + m_stateLock.getWriteHoldCount() + " thread: " + Thread.currentThread() + " time: " + System.currentTimeMillis());
+ try
+ {
+ m_stateLock.unlockReadLock();
+ }
+ catch ( IllegalMonitorStateException e )
+ {
+ StringBuffer b = new StringBuffer( "Locking activity before IllegalMonitorStateException: \n" );
+ for (Iterator i = lockingActivity.iterator(); i.hasNext();)
+ {
+ b.append( " " ).append( i.next() ).append( "\n" );
+ }
+ log( LogService.LOG_ERROR, b.toString(), null );
+ throw e;
+ }
}
- final void escalateLock()
+ final void escalateLock( String source )
{
+ lockingActivity.add( "escalateLock from: " + source + " readLocks: " + m_stateLock.getReadHoldCount() + " writeLocks: " + m_stateLock.getWriteHoldCount() + " thread: " + Thread.currentThread() + " time: " + System.currentTimeMillis());
m_stateLock.unlockReadLock();
try
{
@@ -211,8 +228,9 @@ public abstract class AbstractComponentM
}
}
- final void deescalateLock()
+ final void deescalateLock( String source )
{
+ lockingActivity.add( "deescalateLock from: " + source + " readLocks: " + m_stateLock.getReadHoldCount() + " writeLocks: " + m_stateLock.getWriteHoldCount() + " thread: " + Thread.currentThread() + " time: " + System.currentTimeMillis());
m_stateLock.deescalate();
lockingThread = null;
lockingStackTrace = null;
@@ -240,7 +258,7 @@ public abstract class AbstractComponentM
{
b.append( infos[i] ).append( "\n\n" );
}
- log( LogService.LOG_INFO, b.toString(), null );
+ log( LogService.LOG_ERROR, b.toString(), null );
}
//---------- Component ID management
@@ -289,7 +307,7 @@ public abstract class AbstractComponentM
public final void enable( final boolean async )
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "AbstractComponentManager.enable.1" );
try
{
enableInternal();
@@ -302,7 +320,7 @@ public abstract class AbstractComponentM
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "AbstractComponentManager.enable.1" );
}
}
@@ -312,7 +330,7 @@ public abstract class AbstractComponentM
{
public void run()
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "AbstractComponentManager.enable.2" );
try
{
activateInternal();
@@ -321,7 +339,7 @@ public abstract class AbstractComponentM
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "AbstractComponentManager.enable.2" );
}
}
}
@@ -343,7 +361,7 @@ public abstract class AbstractComponentM
public final void disable( final boolean async )
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "AbstractComponentManager.disable.1" );
try
{
if ( !async )
@@ -356,7 +374,7 @@ public abstract class AbstractComponentM
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "AbstractComponentManager.disable.1" );
}
}
@@ -366,7 +384,7 @@ public abstract class AbstractComponentM
{
public void run()
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "AbstractComponentManager.disable.2" );
try
{
deactivateInternal( ComponentConstants.DEACTIVATION_REASON_DISABLED );
@@ -375,7 +393,7 @@ public abstract class AbstractComponentM
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "AbstractComponentManager.disable.2" );
}
}
}
@@ -407,7 +425,7 @@ public abstract class AbstractComponentM
*/
public void dispose( int reason )
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "AbstractComponentManager.dispose.1" );
try
{
disposeInternal( reason );
@@ -416,7 +434,7 @@ public abstract class AbstractComponentM
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "AbstractComponentManager.dispose.1" );
}
}
}
@@ -1168,7 +1186,7 @@ public abstract class AbstractComponentM
try
{
acm.unregisterComponentService();
- acm.escalateLock();
+ acm.escalateLock( "AbstractComponentManager.State.doDeactivate.1" );
try
{
acm.deleteComponent( reason );
@@ -1176,7 +1194,7 @@ public abstract class AbstractComponentM
}
finally
{
- acm.deescalateLock();
+ acm.deescalateLock( "AbstractComponentManager.State.doDeactivate.1" );
}
}
catch ( Throwable t )
@@ -1328,7 +1346,7 @@ public abstract class AbstractComponentM
// 4. Call the activate method, if present
if ( ( acm.isImmediate() || acm.getComponentMetadata().isFactory() ) )
{
- acm.escalateLock();
+ acm.escalateLock( "AbstractComponentManager.Unsatisifed.activate.1" );
try
{
if ( acm.isImmediate() )
@@ -1344,7 +1362,7 @@ public abstract class AbstractComponentM
}
finally
{
- acm.deescalateLock();
+ acm.deescalateLock( "AbstractComponentManager.Unsatisifed.activate.1" );
}
}
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=1377081&r1=1377080&r2=1377081&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 Fri Aug 24 20:13:07 2012
@@ -32,7 +32,6 @@ import org.apache.felix.scr.impl.config.
import org.apache.felix.scr.impl.metadata.ComponentMetadata;
import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentConstants;
import org.osgi.service.component.ComponentException;
import org.osgi.service.component.ComponentFactory;
@@ -94,7 +93,7 @@ public class ComponentFactoryImpl extend
final ImmediateComponentManager cm = createComponentManager();
ComponentInstance instance;
- final boolean release = cm.obtainReadLock();
+ final boolean release = cm.obtainReadLock( "ComponentFactoryImpl.newInstance.1" );
try
{
cm.setFactoryProperties( dictionary );
@@ -116,7 +115,7 @@ public class ComponentFactoryImpl extend
{
if ( release )
{
- cm.releaseReadLock();
+ cm.releaseReadLock( "ComponentFactoryImpl.newInstance.1" );
}
}
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=1377081&r1=1377080&r2=1377081&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 Fri Aug 24 20:13:07 2012
@@ -139,7 +139,7 @@ public class ConfigurationComponentFacto
}
else //non-spec backwards compatible
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "ConfigurationComponentFactoryImpl.newInstance.1" );
try
{
ImmediateComponentManager cm;
@@ -178,7 +178,7 @@ public class ConfigurationComponentFacto
{
// update the configuration as if called as ManagedService
//TODO deadlock potential, we are holding our own state lock.
- final boolean releaseInner = cm.obtainReadLock();
+ final boolean releaseInner = cm.obtainReadLock( "ConfigurationComponentFactoryImpl.newInstance.2" );
try
{
cm.reconfigure( configuration );
@@ -187,7 +187,7 @@ public class ConfigurationComponentFacto
{
if ( releaseInner )
{
- cm.releaseReadLock();
+ cm.releaseReadLock( "ConfigurationComponentFactoryImpl.newInstance.2" );
}
}
}
@@ -196,7 +196,7 @@ public class ConfigurationComponentFacto
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "ConfigurationComponentFactoryImpl.newInstance.1" );
}
}
}
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=1377081&r1=1377080&r2=1377081&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 Aug 24 20:13:07 2012
@@ -154,7 +154,7 @@ public class DependencyManager implement
final ServiceReference ref = event.getServiceReference();
final String serviceString = "Service " + m_dependencyMetadata.getInterface() + "/"
+ ref.getProperty( Constants.SERVICE_ID );
- final boolean release = m_componentManager.obtainReadLock();
+ final boolean release = m_componentManager.obtainReadLock( "DependencyManager.serviceChanged.1" );
try
{
switch ( event.getType() )
@@ -259,7 +259,7 @@ public class DependencyManager implement
{
if ( release )
{
- m_componentManager.releaseReadLock();
+ m_componentManager.releaseReadLock( "DependencyManager.serviceChanged.1" );
}
}
}
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=1377081&r1=1377080&r2=1377081&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 Fri Aug 24 20:13:07 2012
@@ -618,12 +618,12 @@ public class ImmediateComponentManager e
public Object getService( Bundle bundle, ServiceRegistration serviceRegistration )
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "ImmediateComponentManager.getService.1" );
try
{
if ( m_useCount == 0 )
{
- escalateLock();
+ escalateLock( "ImmediateComponentManager.getService.1" );
try
{
if ( m_useCount == 0 )
@@ -639,7 +639,7 @@ public class ImmediateComponentManager e
}
finally
{
- deescalateLock();
+ deescalateLock( "ImmediateComponentManager.getService.1" );
}
}
m_useCount++;
@@ -649,14 +649,14 @@ public class ImmediateComponentManager e
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "ImmediateComponentManager.getService.1" );
}
}
}
public void ungetService( Bundle bundle, ServiceRegistration serviceRegistration, Object o )
{
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "ImmediateComponentManager.ungetService.1" );
try
{
// the framework should not call ungetService more than it calls
@@ -670,7 +670,7 @@ public class ImmediateComponentManager e
// be kept (FELIX-3039)
if ( m_useCount == 0 && !isImmediate() && !getActivator().getConfiguration().keepInstances() )
{
- escalateLock();
+ escalateLock( "ImmediateComponentManager.ungetService.1" );
try
{
if ( m_useCount == 0 )
@@ -680,7 +680,7 @@ public class ImmediateComponentManager e
}
finally
{
- deescalateLock();
+ deescalateLock( "ImmediateComponentManager.ungetService.1" );
}
}
}
@@ -689,7 +689,7 @@ public class ImmediateComponentManager e
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "ImmediateComponentManager.ungetService.1" );
}
}
}
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=1377081&r1=1377080&r2=1377081&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 Fri Aug 24 20:13:07 2012
@@ -95,7 +95,7 @@ public class ServiceFactoryComponentMana
// When the getServiceMethod is called, the implementation object must be created
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "ServiceFactoryComponentManager.getService.1" );
try
{
// private ComponentContext and implementation instances
@@ -128,7 +128,7 @@ public class ServiceFactoryComponentMana
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "ServiceFactoryComponentManager.getService.1" );
}
}
}
@@ -142,7 +142,7 @@ public class ServiceFactoryComponentMana
log( LogService.LOG_DEBUG, "ServiceFactory.ungetService()", null );
// When the ungetServiceMethod is called, the implementation object must be deactivated
- final boolean release = obtainReadLock();
+ final boolean release = obtainReadLock( "ServiceFactoryComponentManager.ungetService.1" );
try
{
// private ComponentContext and implementation instances
@@ -161,7 +161,7 @@ public class ServiceFactoryComponentMana
{
if ( release )
{
- releaseReadLock();
+ releaseReadLock( "ServiceFactoryComponentManager.ungetService.1" );
}
}
}