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();
+            }
         }
     }