You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2015/10/07 21:31:32 UTC

svn commit: r1707364 - in /felix/sandbox/pderop/dependencymanager.ds: org.apache.felix.dependencymanager.ds.itest/resource/ org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/ org.apache.felix.dependencymanager.ds/src/org/...

Author: pderop
Date: Wed Oct  7 19:31:32 2015
New Revision: 1707364

URL: http://svn.apache.org/viewvc?rev=1707364&view=rev
Log:
Keep the code in sync with the recent commits made in felix-trunk/scr ...

Modified:
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/resource/integration_test_mutable_properties.xml
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/Felix4984Test.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/MutablePropertiesTest.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/Activator.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentContextImpl.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/RegistrationManager.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/SingleComponentManager.java
    felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/resource/integration_test_mutable_properties.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/resource/integration_test_mutable_properties.xml?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
Binary files - no diff available.

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/Felix4984Test.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/Felix4984Test.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/Felix4984Test.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/Felix4984Test.java Wed Oct  7 19:31:32 2015
@@ -25,7 +25,8 @@ public class Felix4984Test extends Compo
           "\\[.*\\] Could not get service from ref \\[org.apache.felix.scr.integration.components.felix4984.A\\]",
           "\\[.*\\] Could not get service from ref \\[org.apache.felix.scr.integration.components.felix4984.B\\]",
           "running test iteration .*",
-          "A\\.setB(.*)"
+          "A\\.setB(.*)",
+          ".*Service not available from service registry for ServiceReference.*"
         };
         //DS_LOGLEVEL = "debug";
         //WRITE_LOGS_TO_FILE = true;

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/MutablePropertiesTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/MutablePropertiesTest.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/MutablePropertiesTest.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/MutablePropertiesTest.java Wed Oct  7 19:31:32 2015
@@ -26,12 +26,14 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 
 import org.apache.felix.scr.integration.components.MutatingService;
+import org.apache.felix.scr.integration.components.MutatingServiceConsumer;
 import org.apache.felix.scr.integration.components.SimpleServiceImpl;
 import org.junit.Test;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
@@ -44,6 +46,7 @@ public class MutablePropertiesTest exten
         super("/resource/integration_test_mutable_properties.xml");
     }
 
+
     @Test
     public void test_mutable_properties() throws InvalidSyntaxException, IOException
     {
@@ -208,4 +211,26 @@ public class MutablePropertiesTest exten
             Assert.assertFalse("Should not contain property " + p, Arrays.asList(serviceReference.getPropertyKeys()).contains(p));
         }
     }
+
+    @Test
+    public void test_mutable_properties_consumer() throws Exception
+    {
+        ServiceReference<MutatingServiceConsumer> mscRef = bundleContext.getServiceReference(MutatingServiceConsumer.class);
+        MutatingServiceConsumer msc = bundleContext.getService(mscRef);
+        assertMsc(msc, null, null, null);
+
+        String componentName = "components.mutable.properties.return2";
+        ComponentDescriptionDTO cd = findComponentDescriptorByName(componentName);
+
+        enableAndCheck(cd);
+
+        assertMsc(msc, false, true, null);
+    }
+
+    private void assertMsc(MutatingServiceConsumer msc, Boolean set, Boolean updated, Boolean unset)
+    {
+        Assert.assertEquals("set ", set, msc.isUpdatedInSet());
+        Assert.assertEquals("updated ", updated, msc.isUpdatedInUpdated());
+        Assert.assertEquals("unset ", unset, msc.isUpdatedInUnset());
+    }
 }
\ No newline at end of file

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/Activator.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/Activator.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/Activator.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/Activator.java Wed Oct  7 19:31:32 2015
@@ -115,7 +115,7 @@ public class Activator extends AbstractE
         BundleContext context;
         if ( globalExtender )
         {
-            context = m_context.getBundle( 0 ).getBundleContext();
+            context = m_context.getBundle( Constants.SYSTEM_BUNDLE_LOCATION ).getBundleContext();
         }
         else
         {
@@ -238,10 +238,21 @@ public class Activator extends AbstractE
 
     //---------- Component Management -----------------------------------------
 
+    private volatile boolean gogoMissing =true;
 
     @Override
     protected Extension doCreateExtension(final Bundle bundle) throws Exception
     {
+        if (gogoMissing)
+        {
+            try
+            {
+                bundle.loadClass("org.apache.felix.service.command.Descriptor");
+                gogoMissing = false;
+            }
+            catch (Throwable e)
+            {}
+        }
         return new ScrExtension(bundle);
     }
 

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/AbstractComponentManager.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/AbstractComponentManager.java Wed Oct  7 19:31:32 2015
@@ -188,7 +188,7 @@ public abstract class AbstractComponentM
         return ScrConfiguration.DEFAULT_LOCK_TIMEOUT_MILLISECONDS;
     }
 
-    private void obtainLock( Lock lock, String source )
+    private void obtainLock( Lock lock )
     {
         try
         {
@@ -218,22 +218,22 @@ public abstract class AbstractComponentM
         }
     }
 
-    final void obtainActivationReadLock( String source )
+    final void obtainActivationReadLock(  )
     {
-        obtainLock( m_activationLock.readLock(), source);
+        obtainLock( m_activationLock.readLock());
     }
 
-    final void releaseActivationReadLock( String source )
+    final void releaseActivationReadLock( )
     {
         m_activationLock.readLock().unlock();
     }
 
-    final void obtainActivationWriteLock( String source )
+    final void obtainActivationWriteLock( )
     {
-        obtainLock( m_activationLock.writeLock(), source);
+        obtainLock( m_activationLock.writeLock());
     }
 
-    final void releaseActivationWriteeLock( String source )
+    final void releaseActivationWriteeLock( )
     {
         if ( m_activationLock.getWriteHoldCount() > 0 )
         {
@@ -241,12 +241,12 @@ public abstract class AbstractComponentM
         }
     }
 
-    final void obtainStateLock( String source )
+    final void obtainStateLock()
     {
-        obtainLock( m_stateLock, source );
+        obtainLock( m_stateLock );
     }
 
-    final void releaseStateLock( String source )
+    final void releaseStateLock()
     {
         m_stateLock.unlock();
     }
@@ -683,7 +683,7 @@ public abstract class AbstractComponentM
             return;
         }
 
-        obtainActivationReadLock( "activateInternal" );
+        obtainActivationReadLock(  );
         try
         {
             // Double check conditions now that we have obtained the lock
@@ -726,7 +726,7 @@ public abstract class AbstractComponentM
         }
         finally
         {
-            releaseActivationReadLock( "activateInternal" );
+            releaseActivationReadLock(  );
         }
     }
 
@@ -751,14 +751,14 @@ public abstract class AbstractComponentM
 
         // catch any problems from deleting the component to prevent the
         // component to remain in the deactivating state !
-        obtainActivationReadLock( "deactivateInternal" );
+        obtainActivationReadLock(  );
         try
         {
             doDeactivate( reason, disable || m_factoryInstance );
         }
         finally
         {
-            releaseActivationReadLock( "deactivateInternal" );
+            releaseActivationReadLock(  );
         }
         if ( isFactory() || m_factoryInstance || dispose )
         {
@@ -775,7 +775,7 @@ public abstract class AbstractComponentM
             {
                 log( LogService.LOG_DEBUG, "Component deactivation occuring on another thread", null );
             }
-            obtainStateLock( "AbstractComponentManager.State.doDeactivate.1" );
+            obtainStateLock(  );
             try
             {
             	m_satisfied = false;
@@ -789,7 +789,7 @@ public abstract class AbstractComponentM
             }
             finally
             {
-                releaseStateLock( "AbstractComponentManager.State.doDeactivate.1" );
+                releaseStateLock( );
             }
         }
         catch ( Throwable t )
@@ -878,6 +878,12 @@ public abstract class AbstractComponentM
         }
 
         @Override
+        void postRegister(ServiceRegistration<S> t)
+        {
+            AbstractComponentManager.this.postRegister();
+        }
+
+        @Override
         void unregister(ServiceRegistration<S> serviceRegistration)
         {
             serviceRegistration.unregister();
@@ -1381,6 +1387,8 @@ public abstract class AbstractComponentM
         }
     }
 
+    abstract void postRegister();
+
     boolean isInternalEnabled()
     {
         return m_internalEnabled;

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentContextImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentContextImpl.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentContextImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentContextImpl.java Wed Oct  7 19:31:32 2015
@@ -20,8 +20,6 @@ package org.apache.felix.scr.impl.manage
 
 
 import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -31,7 +29,6 @@ import org.apache.felix.scr.impl.helper.
 import org.apache.felix.scr.impl.helper.ReadOnlyDictionary;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentInstance;
 import org.osgi.service.log.LogService;
@@ -116,7 +113,7 @@ public class ComponentContextImpl<S> imp
 
     public Object locateService( String name )
     {
-        m_componentManager.obtainActivationReadLock( "locate.service.name" );
+        m_componentManager.obtainActivationReadLock( );
         try
         {
             DependencyManager<S, ?> dm = m_componentManager.getDependencyManager( name );
@@ -124,14 +121,14 @@ public class ComponentContextImpl<S> imp
         }
         finally
         {
-            m_componentManager.releaseActivationReadLock( "locate.service.name" );
+            m_componentManager.releaseActivationReadLock(  );
         }
     }
 
 
     public Object locateService( String name, ServiceReference ref )
     {
-        m_componentManager.obtainActivationReadLock( "locate.service.ref" );
+        m_componentManager.obtainActivationReadLock(  );
         try
         {
             DependencyManager<S, ?> dm = m_componentManager.getDependencyManager( name );
@@ -139,14 +136,14 @@ public class ComponentContextImpl<S> imp
         }
         finally
         {
-            m_componentManager.releaseActivationReadLock( "locate.service.ref" );
+            m_componentManager.releaseActivationReadLock( );
         }
     }
 
 
     public Object[] locateServices( String name )
     {
-        m_componentManager.obtainActivationReadLock( "locate.services" );
+        m_componentManager.obtainActivationReadLock(  );
         try
         {
             DependencyManager<S, ?> dm = m_componentManager.getDependencyManager( name );
@@ -154,7 +151,7 @@ public class ComponentContextImpl<S> imp
         }
         finally
         {
-            m_componentManager.releaseActivationReadLock( "locate.services" );
+            m_componentManager.releaseActivationReadLock( );
         }
     }
 

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java Wed Oct  7 19:31:32 2015
@@ -276,6 +276,11 @@ public class ComponentFactoryImpl<S> ext
         throw new IllegalStateException( "ComponentFactory service properties are immutable" );
     }
 
+    @Override
+    void postRegister()
+    {
+        //do nothing
+    }
 
     public Dictionary<String, Object> getServiceProperties()
     {
@@ -413,5 +418,4 @@ public class ComponentFactoryImpl<S> ext
         }
     }
 
-
 }

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/RegistrationManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/RegistrationManager.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/RegistrationManager.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/RegistrationManager.java Wed Oct  7 19:31:32 2015
@@ -67,15 +67,14 @@ abstract class RegistrationManager<T>
         {
             return regState.toString();
         }
-        
-        
-        
+
     }
     private final Lock registrationLock = new ReentrantLock();
     //Deque, ArrayDeque if we had java 6
     private final List<RegStateWrapper> opqueue = new ArrayList<RegStateWrapper>();
 
     private volatile T m_serviceRegistration;
+
     /**
      * 
      * @param desired desired registration state
@@ -154,6 +153,7 @@ abstract class RegistrationManager<T>
                     if ( next.getRegState() == RegState.registered)
                     {
                         m_serviceRegistration = serviceRegistration;
+                        postRegister( m_serviceRegistration );
                     }
                     next.getLatch().countDown();
                 }
@@ -200,6 +200,8 @@ abstract class RegistrationManager<T>
     
     abstract T register(String[] services);
 
+    abstract void postRegister(T t);
+
     abstract void unregister(T serviceRegistration);
     
     abstract void log( int level, String message, Object[] arguments, Throwable ex );

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Wed Oct  7 19:31:32 2015
@@ -21,6 +21,7 @@ package org.apache.felix.scr.impl.manage
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Dictionary;
 import java.util.IdentityHashMap;
 
 import org.apache.felix.scr.impl.config.ComponentContainer;
@@ -42,6 +43,19 @@ import org.osgi.service.log.LogService;
 public class ServiceFactoryComponentManager<S> extends SingleComponentManager<S>
 {
 
+    @Override
+    public void setServiceProperties(Dictionary<String, ?> serviceProperties)
+    {
+        throw new IllegalStateException( "Bundle scoped service properties are immutable" );
+    }
+
+
+    @Override
+    void postRegister()
+    {
+        // do nothing
+    }
+
     // maintain the map of ComponentContext objects created for the
     // service instances
     private IdentityHashMap<S, ComponentContextImpl<S>> serviceContexts = new IdentityHashMap<S, ComponentContextImpl<S>>();

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/SingleComponentManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/SingleComponentManager.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/SingleComponentManager.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/src/org/apache/felix/scr/impl/manager/SingleComponentManager.java Wed Oct  7 19:31:32 2015
@@ -499,6 +499,15 @@ public class SingleComponentManager<S> e
     }
 
     @Override
+    void postRegister()
+    {
+        if (m_serviceProperties != null)
+        {
+            updateServiceRegistration();
+        }
+    }
+
+    @Override
     public Dictionary<String, Object> getServiceProperties()
     {
         if ( m_serviceProperties != null )
@@ -521,6 +530,10 @@ public class SingleComponentManager<S> e
                 {
                     sr.setProperties( regProps );
                 }
+                else
+                {
+                    log( LogService.LOG_DEBUG, "Not updating service registration, no change in properties", null, null );
+                }
             }
             catch ( IllegalStateException ise )
             {
@@ -536,6 +549,10 @@ public class SingleComponentManager<S> e
                 log( LogService.LOG_ERROR, "Unexpected problem when updating service registration", t );
             }
         }
+        else
+        {
+            log( LogService.LOG_DEBUG, "No service registration to update", null, null );
+        }
     }
 
     /**
@@ -587,14 +604,14 @@ public class SingleComponentManager<S> e
 
             // unsatisfied component and non-ignored configuration may change targets
             // to satisfy references
-            obtainActivationWriteLock( "reconfigure" );
+            obtainActivationWriteLock( );
             try
             {
                 if ( !isSatisfied() && !getComponentMetadata().isConfigurationIgnored() )
                 {
                     log( LogService.LOG_DEBUG, "Attempting to activate unsatisfied component", null );
                     updateTargets( getProperties() );
-                    releaseActivationWriteeLock( "reconfigure.unsatisfied" );
+                    releaseActivationWriteeLock(  );
                     activateInternal( );
                     return;
                 }
@@ -609,20 +626,20 @@ public class SingleComponentManager<S> e
                     // FELIX-2368: cycle component immediately, reconfigure() is
                     //     called through ConfigurationListener API which itself is
                     //     called asynchronously by the Configuration Admin Service
-                    releaseActivationWriteeLock( "reconfigure.modified.1" );
+                    releaseActivationWriteeLock(  );
                     //we have already determined that modify cannot be called. Therefore factory instances must be disposed.
                     boolean dispose = m_factoryInstance;
                     deactivateInternal( reason, dispose, dispose );
                     if ( !dispose )
                     {
-                        obtainActivationWriteLock("reconfigure.deactivate.activate");
+                        obtainActivationWriteLock();
                         try
                         {
                             updateTargets(getProperties());
                         }
                         finally
                         {
-                            releaseActivationWriteeLock("reconfigure.deactivate.activate");
+                            releaseActivationWriteeLock();
                         }
                         activateInternal();
                     }
@@ -631,7 +648,7 @@ public class SingleComponentManager<S> e
             finally
             {
                 //used if modify succeeds or if there's an exception.
-                releaseActivationWriteeLock( "reconfigure.end" );;
+                releaseActivationWriteeLock(  );
             }
         }
         finally
@@ -677,7 +694,7 @@ public class SingleComponentManager<S> e
         // 4. call method (nothing to do when failed, since it has already been logged)
         //   (call with non-null default result to continue even if the
         //    modify method call failed)
-        obtainStateLock( "ImmediateComponentManager.modify" );
+        obtainStateLock(  );
         try
         {
             //cf 112.5.12 where invoking modified method before updating target services is specified.
@@ -717,7 +734,7 @@ public class SingleComponentManager<S> e
         }
         finally
         {
-            releaseStateLock( "ImmediateComponentManager.modify" );
+            releaseStateLock(  );
         }
     }
 
@@ -760,16 +777,35 @@ public class SingleComponentManager<S> e
 
     public S getService( Bundle bundle, ServiceRegistration<S> serviceRegistration )
     {
-        boolean success = getServiceInternal();
-        ComponentContextImpl<S> componentContext = m_componentContext;
-        if ( success && componentContext != null)
+        obtainStateLock(  );
+        try
         {
             m_useCount.incrementAndGet();
-            return componentContext.getImplementationObject( true );
         }
-        else
+        finally
         {
-            return null;
+            releaseStateLock( );
+        }
+        boolean decrement = true;
+        try {
+            boolean success = getServiceInternal();
+            ComponentContextImpl<S> componentContext = m_componentContext;
+            if ( success && componentContext != null)
+            {
+                decrement = false;
+                return componentContext.getImplementationObject( true );
+            }
+            else
+            {
+                return null;
+            }
+        }
+        finally
+        {
+            if ( decrement )
+            {
+                ungetService( bundle, serviceRegistration, null );
+            }
         }
     }
 
@@ -805,7 +841,7 @@ public class SingleComponentManager<S> e
                             null );
                     success = false;
                 }
-                obtainStateLock( "ImmediateComponentManager.getService.1" );
+                obtainStateLock(  );
                 try
                 {
                     if ( m_componentContext == null )
@@ -824,7 +860,7 @@ public class SingleComponentManager<S> e
                 }
                 finally
                 {
-                    releaseStateLock( "ImmediateComponentManager.getService.1" );
+                    releaseStateLock(  );
                 }
             }
             return success;
@@ -872,31 +908,21 @@ public class SingleComponentManager<S> e
 
     public void ungetService( Bundle bundle, ServiceRegistration<S> serviceRegistration, S o )
     {
-        // the framework should not call ungetService more than it calls
-        // calls getService. Still, we want to be sure to not go below zero
-        if ( m_useCount.get() > 0 )
+        obtainStateLock( );
+        try
         {
-            int useCount = m_useCount.decrementAndGet();
-
             // unget the service instance if no bundle is using it
             // any longer unless delayed component instances have to
             // be kept (FELIX-3039)
-            if ( useCount == 0 && !isImmediate() && !keepInstances() )
+            if (  m_useCount.decrementAndGet() == 0 && !isImmediate() && !keepInstances() )
             {
-                obtainStateLock( "ImmediateComponentManager.ungetService.1" );
-                try
-                {
-                    if ( m_useCount.get() == 0 )
-                    {
-                        ungetService( );
-                    }
-                }
-                finally
-                {
-                    releaseStateLock( "ImmediateComponentManager.ungetService.1" );
-                }
+                ungetService( );
             }
         }
+        finally
+        {
+            releaseStateLock(  );
+        }
     }
 
     private void ungetService( )

Modified: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java?rev=1707364&r1=1707363&r2=1707364&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java (original)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java Wed Oct  7 19:31:32 2015
@@ -91,6 +91,12 @@ public class RegistrationManagerTest
         }
 
         @Override
+        void postRegister(Object t)
+        {
+            // TODO Auto-generated method stub
+        }
+
+        @Override
         void unregister(Object serviceRegistration)
         {
             try
@@ -107,7 +113,7 @@ public class RegistrationManagerTest
         @Override
         void log(int level, String message, Object[] arguments, Throwable ex)
         {
-            if ( arguments.length == 1 && (arguments[0] instanceof ArrayList))
+            if ( arguments != null && arguments.length == 1 && (arguments[0] instanceof ArrayList))
             {
                 ArrayList<RegState> opqueue = ( ArrayList<org.apache.felix.scr.impl.manager.RegistrationManager.RegState> ) arguments[0];
 //                System.out.println("opqueue: " + opqueue);
@@ -140,6 +146,6 @@ public class RegistrationManagerTest
             // TODO Auto-generated method stub
             
         }
-        
+
     }
 }