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 2013/04/22 08:44:31 UTC
svn commit: r1470396 -
/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
Author: djencks
Date: Mon Apr 22 06:44:30 2013
New Revision: 1470396
URL: http://svn.apache.org/r1470396
Log:
FELIX-4020 fix the circular reference tests by detecting circular reference earlier and returning null immediately
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
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=1470396&r1=1470395&r2=1470396&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 Mon Apr 22 06:44:30 2013
@@ -72,7 +72,9 @@ public class ImmediateComponentManager<S
private volatile long m_changeCount = -1;
- /**
+ private final ThreadLocal<Boolean> m_circularReferences = new ThreadLocal<Boolean>();
+
+ /**
* The constructor receives both the activator and the metadata
*
* @param activator
@@ -710,58 +712,71 @@ public class ImmediateComponentManager<S
}
}
+
@Override
boolean getServiceInternal()
{
- boolean success = true;
- if ( m_componentContext == null )
+ if (m_circularReferences.get() != null)
{
- try
+ return false;
+ }
+ m_circularReferences.set( Boolean.TRUE );
+ try
+ {
+ boolean success = true;
+ if ( m_componentContext == null )
{
- if ( !collectDependencies() )
+ try
{
- log(
- LogService.LOG_DEBUG,
- "getService did not win collecting dependencies, try creating object anyway.",
- null );
+ if ( !collectDependencies() )
+ {
+ log(
+ LogService.LOG_DEBUG,
+ "getService did not win collecting dependencies, try creating object anyway.",
+ null );
+ }
+ else
+ {
+ log(
+ LogService.LOG_DEBUG,
+ "getService won collecting dependencies, proceed to creating object.",
+ null );
+
+ }
}
- else
+ catch ( IllegalStateException e )
{
log(
- LogService.LOG_DEBUG,
- "getService won collecting dependencies, proceed to creating object.",
+ LogService.LOG_INFO,
+ "Could not obtain all required dependencies, getService returning null",
null );
-
+ success = false;
}
- }
- catch ( IllegalStateException e )
- {
- log(
- LogService.LOG_INFO,
- "Could not obtain all required dependencies, getService returning null",
- null );
- success = false;
- }
- obtainWriteLock( "ImmediateComponentManager.getService.1" );
- try
- {
- if ( m_componentContext == null )
+ obtainWriteLock( "ImmediateComponentManager.getService.1" );
+ try
{
- //state should be "Registered"
- S result = (S) state().getService( this );
- if ( result == null )
+ if ( m_componentContext == null )
{
- success = false;;
+ //state should be "Registered"
+ S result = (S) state().getService( this );
+ if ( result == null )
+ {
+ success = false;;
+ }
}
}
+ finally
+ {
+ releaseWriteLock( "ImmediateComponentManager.getService.1" );
+ }
}
- finally
- {
- releaseWriteLock( "ImmediateComponentManager.getService.1" );
- }
+ return success;
+ }
+ finally
+ {
+ m_circularReferences.remove();
}
- return success;
}
public void ungetService( Bundle bundle, ServiceRegistration<S> serviceRegistration, S o )