Author: djencks
Date: Thu Nov 29 23:53:34 2012
New Revision: 1415462

URL: http://svn.apache.org/viewvc?rev=1415462&view=rev
Log:
FELIX-3790 shorten window when service events are dropped

Modified:
    
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

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=1415462&r1=1415461&r2=1415462&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 Nov 29 23:53:34 2012
@@ -1215,38 +1215,31 @@ public class DependencyManager<S, T> imp
     boolean invokeBindMethod( S componentInstance, ServiceReference<T> ref )
     {
         //event driven, and we already checked this ref is not yet handled.
-        if ( componentInstance != null )
+        Map<DependencyManager<S, ?>, Map<ServiceReference<?>, RefPair<?>>> 
dependencyMap = m_componentManager.getDependencyMap();
+        if ( dependencyMap != null )
         {
-            Map<DependencyManager<S, ?>, Map<ServiceReference<?>, RefPair<?>>> 
dependencyMap = m_componentManager.getDependencyMap();
-            if ( dependencyMap != null )
+            if ( m_bindMethods == null )
             {
-                if (m_bindMethods == null)
-                {
-                    m_componentManager.log( LogService.LOG_ERROR,
+                m_componentManager.log( LogService.LOG_ERROR,
                         "For dependency {0}, bind method not set: component 
state {1}",
                         new Object[]
-                            { m_dependencyMetadata.getName(), new 
Integer(m_componentManager.getState())  }, null );
+                                {m_dependencyMetadata.getName(), new Integer( 
m_componentManager.getState() )}, null );
 
-                }
-                Map<ServiceReference<T>, RefPair<T>> deps = 
(Map)dependencyMap.get( this );
-                RefPair<T> refPair = new RefPair<T>( ref );
-                if ( !m_bindMethods.getBind().getServiceObject( refPair, 
m_componentManager.getActivator().getBundleContext() ) )
-                {
-                    //reference deactivated while we are processing.
-                    return false;
-                }
+            }
+            Map<ServiceReference<T>, RefPair<T>> deps = 
(Map)dependencyMap.get( this );
+            RefPair<T> refPair = new RefPair<T>( ref );
+            if ( !m_bindMethods.getBind().getServiceObject( refPair, 
m_componentManager.getActivator().getBundleContext() ) )
+            {
+                //reference deactivated while we are processing.
+                return false;
+            }
+            synchronized ( deps )
+            {
                 deps.put( ref, refPair );
-                return invokeBindMethod( componentInstance, refPair );
             }
-            return false;
-        }
-        else
-        {
-            m_componentManager.log( LogService.LOG_DEBUG,
-                "DependencyManager : component not yet created, assuming bind 
method call succeeded",
-                null );
-            return true;
+            return invokeBindMethod( componentInstance, refPair );
         }
+        return false;
     }
 
     public void invokeBindMethodLate( final ServiceReference<T> ref )

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=1415462&r1=1415461&r2=1415462&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 Nov 29 23:53:34 2012
@@ -259,7 +259,10 @@ public class ImmediateComponentManager<S
             return null;
         }
 
-        // 3. Bind the target services
+        // 3. set the implementation object prematurely
+        setter.presetImplementationObject( implementationObject );
+
+        // 4. Bind the target services
         Map<DependencyManager<S, ?>, Map<ServiceReference<?>, RefPair<?>>> 
parameters = getDependencyMap();
 
         for ( DependencyManager<S, ?> dm: getDependencyManagers())
@@ -268,7 +271,12 @@ public class ImmediateComponentManager<S
             // creating the instance fails here, so we deactivate and return
             // null.
             Map<ServiceReference<?>, RefPair<?>> params = parameters.get( dm );
-            if ( !dm.open( implementationObject, params ) )
+            boolean open;
+            synchronized ( params )
+            {
+                open = dm.open( implementationObject, params );
+            }
+            if ( !open )
             {
                 log( LogService.LOG_ERROR, "Cannot create component instance 
due to failure to bind reference {0}",
                         new Object[]
@@ -284,9 +292,6 @@ public class ImmediateComponentManager<S
             }
         }
 
-        // 4. set the implementation object prematurely
-        setter.presetImplementationObject( implementationObject );
-
         // 5. Call the activate method, if present
         final MethodResult result = 
getComponentMethods().getActivateMethod().invoke( implementationObject, new 
ActivatorParameter(
                 componentContext, 1 ), null );


Reply via email to