Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Charles David2015-08-28 12:35:40 +0000
committerPierre-Charles David2015-09-14 14:27:30 +0000
commitd19a3e61524136c136cc2642e0f8342e6b961aa2 (patch)
treebaa1c077f90352698af17e14199acfb62cb2df78
parentee528044b8de2d0992ab458e5a2c925893618b8e (diff)
downloadorg.eclipse.sirius-d19a3e61524136c136cc2642e0f8342e6b961aa2.tar.gz
org.eclipse.sirius-d19a3e61524136c136cc2642e0f8342e6b961aa2.tar.xz
org.eclipse.sirius-d19a3e61524136c136cc2642e0f8342e6b961aa2.zip
[477046] Avoid re-entrant ResourceSetSync notifications
Bug: 477046 Change-Id: I5d8399789a74f3d591a36e5528d81132f52c1e4f Cherry-picked-from: 36e28c09b9232b5201aa4508f375fd21496162a4 Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java15
1 files changed, 12 insertions, 3 deletions
diff --git a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java
index 5a248561c2..dd499bfe0d 100644
--- a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java
+++ b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java
@@ -19,6 +19,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
@@ -87,6 +88,8 @@ public final class ResourceSetSync extends ResourceSetListenerImpl implements Re
private Collection<Resource> savedResources = Sets.newLinkedHashSet();
private final ArrayList<IFileModificationValidator> fileModificationValidators;
+
+ private final AtomicBoolean notificationInProgress = new AtomicBoolean(false);
/**
* The {@link ResourceStatus} represents the in memory status of a resource
@@ -382,9 +385,15 @@ public final class ResourceSetSync extends ResourceSetListenerImpl implements Re
}
private void notifyClientsInBatch(Collection<ResourceStatusChange> changes) {
- if (notificationIsRequired && changes.size() > 0) {
- for (final ResourceSyncClient client : Lists.newArrayList(clients)) {
- client.statusesChanged(changes);
+ if (notificationInProgress.compareAndSet(false, true)) {
+ try {
+ if (notificationIsRequired && changes.size() > 0) {
+ for (final ResourceSyncClient client : Lists.newArrayList(clients)) {
+ client.statusesChanged(changes);
+ }
+ }
+ } finally {
+ notificationInProgress.set(false);
}
}
}

Back to the top