diff options
| author | Pierre-Charles David | 2015-08-28 12:35:40 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2015-09-14 14:27:30 +0000 |
| commit | d19a3e61524136c136cc2642e0f8342e6b961aa2 (patch) | |
| tree | baa1c077f90352698af17e14199acfb62cb2df78 | |
| parent | ee528044b8de2d0992ab458e5a2c925893618b8e (diff) | |
| download | org.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.java | 15 |
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); } } } |
