You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2010/12/17 09:51:52 UTC
svn commit: r1050320 -
/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
Author: marrs
Date: Fri Dec 17 08:51:52 2010
New Revision: 1050320
URL: http://svn.apache.org/viewvc?rev=1050320&view=rev
Log:
Synchronized access to m_sr.
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java?rev=1050320&r1=1050319&r2=1050320&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java Fri Dec 17 08:51:52 2010
@@ -78,7 +78,7 @@ public class ServiceDependencyImpl exten
private boolean m_propagate;
private Object m_propagateCallbackInstance;
private String m_propagateCallbackMethod;
- private Map m_sr = new HashMap(); /* <DependencyService, Set<ServiceReference>> */
+ private final Map m_sr = new HashMap(); /* <DependencyService, Set<ServiceReference>> */
private static final Comparator COMPARATOR = new Comparator() {
public int getRank(ServiceReference ref) {
@@ -193,19 +193,21 @@ public class ServiceDependencyImpl exten
/** Copying constructor that clones an existing instance. */
public ServiceDependencyImpl(ServiceDependencyImpl prototype) {
super(prototype);
- m_context = prototype.m_context;
- m_autoConfig = prototype.m_autoConfig;
- m_trackedServiceName = prototype.m_trackedServiceName;
- m_nullObject = prototype.m_nullObject;
- m_trackedServiceFilter = prototype.m_trackedServiceFilter;
- m_trackedServiceFilterUnmodified = prototype.m_trackedServiceFilterUnmodified;
- m_trackedServiceReference = prototype.m_trackedServiceReference;
- m_callbackInstance = prototype.m_callbackInstance;
- m_callbackAdded = prototype.m_callbackAdded;
- m_callbackChanged = prototype.m_callbackChanged;
- m_callbackRemoved = prototype.m_callbackRemoved;
- m_autoConfigInstance = prototype.m_autoConfigInstance;
- m_defaultImplementation = prototype.m_defaultImplementation;
+ synchronized (prototype) {
+ m_context = prototype.m_context;
+ m_autoConfig = prototype.m_autoConfig;
+ m_trackedServiceName = prototype.m_trackedServiceName;
+ m_nullObject = prototype.m_nullObject;
+ m_trackedServiceFilter = prototype.m_trackedServiceFilter;
+ m_trackedServiceFilterUnmodified = prototype.m_trackedServiceFilterUnmodified;
+ m_trackedServiceReference = prototype.m_trackedServiceReference;
+ m_callbackInstance = prototype.m_callbackInstance;
+ m_callbackAdded = prototype.m_callbackAdded;
+ m_callbackChanged = prototype.m_callbackChanged;
+ m_callbackRemoved = prototype.m_callbackRemoved;
+ m_autoConfigInstance = prototype.m_autoConfigInstance;
+ m_defaultImplementation = prototype.m_defaultImplementation;
+ }
}
public Dependency createCopy() {
@@ -491,15 +493,18 @@ public class ServiceDependencyImpl exten
m_context.ungetService(ref);
}
-
public void invokeAdded(DependencyService dependencyService, ServiceReference reference, Object service) {
- Set set = (Set) m_sr.get(dependencyService);
- if (set == null) {
- set = new HashSet();
- m_sr.put(dependencyService, set);
+ boolean added = false;
+ synchronized (m_sr) {
+ Set set = (Set) m_sr.get(dependencyService);
+ if (set == null) {
+ set = new HashSet();
+ m_sr.put(dependencyService, set);
+ }
+ added = set.add(reference);
}
- if (set.add(reference)) {
+ if (added) {
invoke(dependencyService, reference, service, m_callbackAdded);
}
}
@@ -509,8 +514,12 @@ public class ServiceDependencyImpl exten
}
public void invokeRemoved(DependencyService dependencyService, ServiceReference reference, Object service) {
- Set set = (Set) m_sr.get(dependencyService);
- if (set != null && set.remove(reference)) {
+ boolean removed = false;
+ synchronized (m_sr) {
+ Set set = (Set) m_sr.get(dependencyService);
+ removed = (set != null && set.remove(reference));
+ }
+ if (removed) {
invoke(dependencyService, reference, service, m_callbackRemoved);
}
}
@@ -830,7 +839,10 @@ public class ServiceDependencyImpl exten
}
public void invokeRemoved(DependencyService service) {
- Set references = (Set) m_sr.get(service);
+ Set references = null;
+ synchronized (m_sr) {
+ references = (Set) m_sr.get(service);
+ }
ServiceReference[] refs = (ServiceReference[]) (references != null ? references.toArray(new ServiceReference[references.size()]) : new ServiceReference[0]);
for (int i = 0; i < refs.length; i++) {