Author: [email protected]
Date: Tue Dec 20 12:23:24 2011
New Revision: 1862

Log:
AMDATU-468 Removed synchronization from callbacks methods to avoid deadlocks

Modified:
   
trunk/amdatu-core/tenant/src/main/java/org/amdatu/core/tenant/factory/TenantServiceFactory.java

Modified: 
trunk/amdatu-core/tenant/src/main/java/org/amdatu/core/tenant/factory/TenantServiceFactory.java
==============================================================================
--- 
trunk/amdatu-core/tenant/src/main/java/org/amdatu/core/tenant/factory/TenantServiceFactory.java
     (original)
+++ 
trunk/amdatu-core/tenant/src/main/java/org/amdatu/core/tenant/factory/TenantServiceFactory.java
     Tue Dec 20 12:23:24 2011
@@ -1,9 +1,8 @@
 package org.amdatu.core.tenant.factory;
 
 import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.amdatu.core.tenant.Tenant;
 import org.apache.felix.dm.Component;
@@ -20,7 +19,7 @@
  * @author <a href="mailto:[email protected]";>Amdatu Project 
Team</a>
  * 
  */
-public class TenantServiceFactory implements ManagedServiceFactory {
+public final class TenantServiceFactory implements ManagedServiceFactory {
 
     public static final String PID = "org.amdatu.core.tenant.factory";
 
@@ -28,22 +27,23 @@
     public static final String NAME_KEY = "name";
     public static final String HOST_KEY = "host";
 
-    private final Map<String, Component> m_components = new HashMap<String, 
Component>();
+    private final ConcurrentHashMap<String, Component> m_components = new 
ConcurrentHashMap<String, Component>();
 
     private volatile DependencyManager m_dependencyManager;
     private volatile LogService m_logService;
 
+    /**
+     * @see org.osgi.service.cm.ManagedServiceFactory#getName()
+     */
     public String getName() {
         return PID;
     }
 
-    public synchronized void updated(String pid, Dictionary/* <String, String> 
*/properties)
+    /**
+     * @see 
org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String, 
java.util.Dictionary)
+     */
+    public void updated(String pid, Dictionary/* <String, String> */properties)
         throws ConfigurationException {
-        if (m_components.containsKey(pid)) {
-            m_logService.log(LogService.LOG_DEBUG, "pid already registered for 
tenant '" + properties.get(ID_KEY)
-                + "', skipping registration");
-            return;
-        }
 
         String id = (String) properties.get(ID_KEY);
         String name = (String) properties.get(NAME_KEY);
@@ -61,12 +61,23 @@
             .setInterface(Tenant.class.getName(), serviceProperties)
             .setImplementation(tenant);
 
-        m_dependencyManager.add(component);
-        m_components.put(pid, component);
+        if (m_components.putIfAbsent(pid, component) == null) {
+            m_dependencyManager.add(component);
+        }
+        else {
+            m_logService.log(LogService.LOG_DEBUG, "pid already registered for 
tenant '" + properties.get(ID_KEY)
+                + "', skipping registration");
+        }
     }
 
-    public synchronized void deleted(String pid) {
-        m_logService.log(LogService.LOG_INFO, "Unregistering tenant service 
with pid: '" + pid + "'");
-        m_dependencyManager.remove(m_components.remove(pid));
+    /**
+     * @see org.osgi.service.cm.ManagedServiceFactory#deleted(java.lang.String)
+     */
+    public void deleted(String pid) {
+        Component component = m_components.remove(pid);
+        if (component != null) {
+            m_logService.log(LogService.LOG_INFO, "Unregistering tenant 
service with pid: '" + pid + "'");
+            m_dependencyManager.remove(m_components.remove(pid));
+        }
     }
 }
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to