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++) {