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.