[nocr] Fixed a deadlock in FacetedProject caused by notifying faceted project listeners while holding the monitor on the list of listeners.
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.project.facet.core/META-INF/MANIFEST.MF
index 7622a80..c979c2e 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.project.facet.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
Bundle-Vendor: %providerName
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.wst.common.project.facet.core; singleton:=true
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 1.0.1.qualifier
Bundle-ClassPath: .
Bundle-Activator: org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin
Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java
index 30a370e..988a3f1 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java
@@ -626,18 +626,26 @@
private void notifyListeners()
{
+ // Copy the list of listeners in order to avoid holding the monitor
+ // while calling the listeners. This is done to avoid potential
+ // deadlocks.
+
+ final Object[] copy;
+
synchronized( this.listeners )
{
- for( Iterator itr = this.listeners.iterator(); itr.hasNext(); )
+ copy = this.listeners.toArray();
+ }
+
+ for( int i = 0; i < copy.length; i++ )
+ {
+ try
{
- try
- {
- ( (IFacetedProjectListener) itr.next() ).projectChanged();
- }
- catch( Exception e )
- {
- FacetCorePlugin.log( e );
- }
+ ( (IFacetedProjectListener) copy[ i ] ).projectChanged();
+ }
+ catch( Exception e )
+ {
+ FacetCorePlugin.log( e );
}
}
}