Avoid creating the service object for dependency callbacks.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1493335 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/CreationStrategy.java b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/CreationStrategy.java
index d0f1ae8..a1d6899 100644
--- a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/CreationStrategy.java
+++ b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/CreationStrategy.java
@@ -46,7 +46,7 @@
     
     /**
      * Checks if the given method object is the
-     * {@link IPOJOServiceFactory#getService(ComponentInstance)}
+     * {@link org.apache.felix.ipojo.IPOJOServiceFactory#getService(org.apache.felix.ipojo.ComponentInstance)}
      * method.
      * @param method the method to check
      * @return <code>true</code> if the method is the getService method
@@ -61,7 +61,7 @@
     
     /**
      * Checks if the given method object is the
-     * {@link IPOJOServiceFactory#ungetService(ComponentInstance, Object)}
+     * {@link org.apache.felix.ipojo.IPOJOServiceFactory#ungetService(org.apache.felix.ipojo.ComponentInstance, Object)}
      * method.
      * @param method the method to check
      * @return <code>true</code> if the method is the ungetService method
diff --git a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
index d9b1461..9fbefc9 100644
--- a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
+++ b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
@@ -359,9 +359,7 @@
             if (m_serviceRegistration != null) {
                 return;
             } else {
-                if (m_handler.getInstanceManager().getState() == ComponentInstance.VALID
-                        && m_serviceRegistration == null
-                        && isAtLeastAServiceControllerValid()) {
+                if (m_handler.getInstanceManager().getState() == ComponentInstance.VALID && isAtLeastAServiceControllerValid()) {
                     // Build the service properties list
 
                     BundleContext bc = m_handler.getInstanceManager().getContext();
diff --git a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
index 6d49b9f..7f4996d 100644
--- a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
+++ b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
@@ -781,15 +781,20 @@
 

         // Now call callbacks, the lock is not held anymore

         // Only one of the list is not empty..

-        for (ServiceReference ref : arrivals) {

-            onServiceArrival(ref);

-            // Notify service binding to listeners

-            notifyListeners(DependencyEventType.BINDING, ref, getService(ref, false));

-        }

-        for (ServiceReference ref : departures) {

-            onServiceDeparture(ref);

-            // Notify service unbinding to listeners

-            notifyListeners(DependencyEventType.UNBINDING, ref, getService(ref, false));

+        try {

+            acquireReadLockIfNotHeld();

+            for (ServiceReference ref : arrivals) {

+                onServiceArrival(ref);

+                // Notify service binding to listeners

+                notifyListeners(DependencyEventType.BINDING, ref, m_serviceObjects.get(ref));

+            }

+            for (ServiceReference ref : departures) {

+                onServiceDeparture(ref);

+                // Notify service unbinding to listeners

+                notifyListeners(DependencyEventType.UNBINDING, ref, m_serviceObjects.get(ref));

+            }

+        } finally {

+            releaseReadLockIfHeld();

         }

 

 

@@ -974,10 +979,11 @@
                         m_state = BROKEN;

 

                         // We are going to call callbacks, releasing the lock.

+                        Object svc = m_serviceObjects.get(ref);

                         releaseWriteLockIfHeld();

 

                         // Notify listeners

-                        notifyListeners(DependencyEventType.UNBINDING, ref, getService(ref, false));

+                        notifyListeners(DependencyEventType.UNBINDING, ref, svc);

                         notifyListeners(DependencyEventType.DEPARTURE, ref, null);

 

                         invalidate();  // This will invalidate the instance.

@@ -1056,24 +1062,30 @@
                 }

             }

 

-            // Leaving the locked region to invoke callbacks

+            // Leaving the locked region to invoke callbacks, but grab the read lock

             releaseWriteLockIfHeld();

-            for (ServiceReference ref : departures) {

-                onServiceDeparture(ref);

-                // Notify service unbinding to listeners

-                notifyListeners(DependencyEventType.UNBINDING, ref, getService(ref, false));

+            try {

+                acquireReadLockIfNotHeld();

+                for (ServiceReference ref : departures) {

+                    onServiceDeparture(ref);

+                    // Notify service unbinding to listeners

+                    Object svc = m_serviceObjects.get(ref);

+                    notifyListeners(DependencyEventType.UNBINDING, ref, svc);

+                }

+                for (ServiceReference ref : arrivals) {

+                    onServiceArrival(ref);

+                    // Notify service binding to listeners

+                    Object svc = m_serviceObjects.get(ref);

+                    notifyListeners(DependencyEventType.BINDING, ref, svc);

+                }

+                // Do we have a modified service ?

+                if (set.modified != null && m_boundServices.contains(set.modified)) {

+                    onServiceModification(set.modified);

+                    // TODO call boundServiceModified on listeners???

+                }

+            } finally {

+                releaseReadLockIfHeld();

             }

-            for (ServiceReference ref : arrivals) {

-                onServiceArrival(ref);

-                // Notify service binding to listeners

-                notifyListeners(DependencyEventType.BINDING, ref, getService(ref, false));

-            }

-            // Do we have a modified service ?

-            if (set.modified != null && m_boundServices.contains(set.modified)) {

-                onServiceModification(set.modified);

-                // TODO call boundServiceModified on listeners???

-            }

-

 

             // Did our state changed ?

             // this method will manage its own synchronization.