Index: core/src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java =================================================================== --- core/src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java (revision 2794) +++ core/src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java (working copy) @@ -12,7 +12,6 @@ import java.io.File; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IContainer; @@ -219,7 +218,9 @@ */ public static void addResourceStateChangeListener( IResourceStateChangeListener listener) { - listeners.add(listener); + synchronized(listeners) { + listeners.add(listener); + } } /* @@ -227,7 +228,9 @@ */ public static void removeResourceStateChangeListener( IResourceStateChangeListener listener) { - listeners.remove(listener); + synchronized(listeners) { + listeners.remove(listener); + } } /** @@ -235,9 +238,13 @@ * changed */ public static void broadcastSyncInfoChanges(final IResource[] resources) { - for (Iterator it = listeners.iterator(); it.hasNext();) { - final IResourceStateChangeListener listener = (IResourceStateChangeListener) it - .next(); + IResourceStateChangeListener[] toNotify; + synchronized(listeners) { + toNotify = (IResourceStateChangeListener[])listeners.toArray(new IResourceStateChangeListener[listeners.size()]); + } + + for (int i = 0; i < toNotify.length; ++i) { + final IResourceStateChangeListener listener = toNotify[i]; ISafeRunnable code = new ISafeRunnable() { public void run() throws Exception { listener.resourceSyncInfoChanged(resources); @@ -274,9 +281,13 @@ */ public static void broadcastModificationStateChanges( final IResource[] resources) { - for (Iterator it = listeners.iterator(); it.hasNext();) { - final IResourceStateChangeListener listener = (IResourceStateChangeListener) it - .next(); + IResourceStateChangeListener[] toNotify; + synchronized(listeners) { + toNotify = (IResourceStateChangeListener[])listeners.toArray(new IResourceStateChangeListener[listeners.size()]); + } + + for (int i = 0; i < toNotify.length; ++i) { + final IResourceStateChangeListener listener = toNotify[i]; ISafeRunnable code = new ISafeRunnable() { public void run() throws Exception { listener.resourceModified(resources); @@ -295,9 +306,13 @@ * invoked when a project is mapped */ protected static void broadcastProjectConfigured(final IProject project) { - for (Iterator it = listeners.iterator(); it.hasNext();) { - final IResourceStateChangeListener listener = (IResourceStateChangeListener) it - .next(); + IResourceStateChangeListener[] toNotify; + synchronized(listeners) { + toNotify = (IResourceStateChangeListener[])listeners.toArray(new IResourceStateChangeListener[listeners.size()]); + } + + for (int i = 0; i < toNotify.length; ++i) { + final IResourceStateChangeListener listener = toNotify[i]; ISafeRunnable code = new ISafeRunnable() { public void run() throws Exception { listener.projectConfigured(project); @@ -316,9 +331,13 @@ * after a provider has been unmaped */ protected static void broadcastProjectDeconfigured(final IProject project) { - for (Iterator it = listeners.iterator(); it.hasNext();) { - final IResourceStateChangeListener listener = (IResourceStateChangeListener) it - .next(); + IResourceStateChangeListener[] toNotify; + synchronized(listeners) { + toNotify = (IResourceStateChangeListener[])listeners.toArray(new IResourceStateChangeListener[listeners.size()]); + } + + for (int i = 0; i < toNotify.length; ++i) { + final IResourceStateChangeListener listener = toNotify[i]; ISafeRunnable code = new ISafeRunnable() { public void run() throws Exception { listener.projectDeconfigured(project);