Bug 480907 - Deadlock in configuration admin when using
MangedService(Factory)
Signed-off-by: Todor Boev <rinsvind@gmail.com>
diff --git a/bundles/org.eclipse.equinox.cm/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.cm/META-INF/MANIFEST.MF
index 01fc261..b5e14a1 100644
--- a/bundles/org.eclipse.equinox.cm/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.cm/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-SymbolicName: org.eclipse.equinox.cm
-Bundle-Version: 1.1.100.qualifier
+Bundle-Version: 1.1.200.qualifier
Bundle-Activator: org.eclipse.equinox.internal.cm.Activator
Import-Package: org.osgi.framework;version="1.7.0",
org.osgi.service.cm;version="[1.5,1.6)",
diff --git a/bundles/org.eclipse.equinox.cm/pom.xml b/bundles/org.eclipse.equinox.cm/pom.xml
index 4364575..4bc9a5b3 100644
--- a/bundles/org.eclipse.equinox.cm/pom.xml
+++ b/bundles/org.eclipse.equinox.cm/pom.xml
@@ -19,6 +19,6 @@
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.cm</artifactId>
- <version>1.1.100-SNAPSHOT</version>
+ <version>1.1.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ConfigurationStore.java b/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ConfigurationStore.java
index ce86b6c..68b0f71 100644
--- a/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ConfigurationStore.java
+++ b/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ConfigurationStore.java
@@ -183,13 +183,16 @@
return configurations.get(pid);
}
- public synchronized ConfigurationImpl[] getFactoryConfigurations(String factoryPid) {
+ public ConfigurationImpl[] getFactoryConfigurations(String factoryPid) {
List<ConfigurationImpl> resultList = new ArrayList<ConfigurationImpl>();
- for (Iterator<ConfigurationImpl> it = configurations.values().iterator(); it.hasNext();) {
+ synchronized (this) {
+ resultList.addAll(configurations.values());
+ }
+ for (Iterator<ConfigurationImpl> it = resultList.iterator(); it.hasNext();) {
ConfigurationImpl config = it.next();
String otherFactoryPid = config.getFactoryPid();
- if (otherFactoryPid != null && otherFactoryPid.equals(factoryPid))
- resultList.add(config);
+ if (otherFactoryPid == null || !otherFactoryPid.equals(factoryPid))
+ it.remove();
}
return resultList.toArray(new ConfigurationImpl[resultList.size()]);
}
diff --git a/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceFactoryTracker.java b/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceFactoryTracker.java
index 5506b7f..af93f1a 100644
--- a/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceFactoryTracker.java
+++ b/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceFactoryTracker.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005, 2013 Cognos Incorporated, IBM Corporation and others.
+ * Copyright (c) 2005, 2015 Cognos Incorporated, IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -151,9 +151,7 @@
if (service == null)
return null;
- synchronized (configurationStore) {
- addReference(reference, service);
- }
+ addReference(reference, service);
return service;
}
@@ -180,16 +178,14 @@
}
}
}
- synchronized (configurationStore) {
- untrackManagedServiceFactory(reference);
- addingService(reference);
- }
+
+ untrackManagedServiceFactory(reference);
+ addingService(reference);
}
public void removedService(ServiceReference<ManagedServiceFactory> reference, ManagedServiceFactory service) {
- synchronized (configurationStore) {
- untrackManagedServiceFactory(reference);
- }
+ untrackManagedServiceFactory(reference);
+
context.ungetService(reference);
}
diff --git a/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceTracker.java b/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceTracker.java
index 3690aa1..2aa9696 100644
--- a/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceTracker.java
+++ b/bundles/org.eclipse.equinox.cm/src/org/eclipse/equinox/internal/cm/ManagedServiceTracker.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005, 2013 Cognos Incorporated, IBM Corporation and others.
+ * Copyright (c) 2005, 2015 Cognos Incorporated, IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -160,9 +160,7 @@
if (service == null)
return null;
- synchronized (configurationStore) {
- addReference(reference, service);
- }
+ addReference(reference, service);
return service;
}
@@ -189,16 +187,14 @@
}
}
}
- synchronized (configurationStore) {
- untrackManagedService(reference);
- addingService(reference);
- }
+
+ untrackManagedService(reference);
+ addingService(reference);
}
public void removedService(ServiceReference<ManagedService> reference, ManagedService service) {
- synchronized (configurationStore) {
- untrackManagedService(reference);
- }
+ untrackManagedService(reference);
+
context.ungetService(reference);
}