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