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/09/27 23:51:15 UTC

svn commit: r1391231 - in /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager: AbstractComponentManager.java ImmediateComponentManager.java

Author: djencks
Date: Thu Sep 27 21:51:15 2012
New Revision: 1391231

URL: http://svn.apache.org/viewvc?rev=1391231&view=rev
Log:
FELIX-3680 fix a few concurrency problems demonstrated by Pierres test

Modified:
    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/ImmediateComponentManager.java

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=1391231&r1=1391230&r2=1391231&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 Sep 27 21:51:15 2012
@@ -1461,6 +1461,11 @@ public abstract class AbstractComponentM
             doDeactivate( acm, reason );
         }
 
+        Object getService( ImmediateComponentManager dcm )
+        {
+            return null;
+        }
+
         void ungetService( ImmediateComponentManager dcm )
         {
             //do nothing, deactivate will unget all the services.
@@ -1623,6 +1628,17 @@ public abstract class AbstractComponentM
             acm.changeState( Disposed.getInstance() );
         }
 
+        Object getService( ImmediateComponentManager dcm )
+        {
+            //concurrent attempt to get service and remove dependency
+            return null;
+        }
+
+        void ungetService( ImmediateComponentManager dcm )
+        {
+            //do nothing.  This can arise if component is deactivated concurrently with ungetService on a delayed component.
+        }
+
     }
 
     protected static abstract class Satisfied extends State
@@ -1754,6 +1770,11 @@ public abstract class AbstractComponentM
             // no service can be returned (be prepared for more logging !!)
             return null;
         }
+
+        void ungetService( ImmediateComponentManager dcm )
+        {
+            //do nothing.  This can arise if component is deactivated concurrently with ungetService on a delayed component.
+        }
     }
 
     /**

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=1391231&r1=1391230&r2=1391231&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 Sep 27 21:51:15 2012
@@ -611,7 +611,8 @@ public class ImmediateComponentManager e
         boolean release = obtainReadLock( "ImmediateComponentManager.getService.1" );
         try
         {
-            if ( m_implementationObject == null )
+            Object implementationObject = m_implementationObject;
+            if ( implementationObject == null )
             {
                 releaseReadLock( "ImmediateComponentManager.getService.1" );
                 try
@@ -658,7 +659,7 @@ public class ImmediateComponentManager e
                 }
             }
             m_useCount++;
-            return state().getService( this );
+            return implementationObject;
         }
         finally
         {