From d67b0d4b51aae78ce345c8ec44a6f7729c5748ae Mon Sep 17 00:00:00 2001 From: Taylor Smock Date: Wed, 24 May 2023 07:40:27 -0600 Subject: [PATCH] Fix #22961: CCE when updating a primitive Signed-off-by: Taylor Smock --- .../workers/MapillarySequenceDownloader.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openstreetmap/josm/plugins/mapillary/gui/workers/MapillarySequenceDownloader.java b/src/main/java/org/openstreetmap/josm/plugins/mapillary/gui/workers/MapillarySequenceDownloader.java index a020fc708..7f88967ad 100644 --- a/src/main/java/org/openstreetmap/josm/plugins/mapillary/gui/workers/MapillarySequenceDownloader.java +++ b/src/main/java/org/openstreetmap/josm/plugins/mapillary/gui/workers/MapillarySequenceDownloader.java @@ -9,6 +9,7 @@ import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Lock; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -175,14 +176,22 @@ protected void done() { protected void process(List chunks) { super.process(chunks); VectorDataSet ds = MapillaryLayer.getInstance().getData(); - for (MapillarySequence seq : chunks) { - for (MapillaryNode oldNode : seq.getNodes()) { - VectorNode oldPrimitive = (VectorNode) ds.getPrimitiveById(oldNode); - if (oldPrimitive != null) { - oldPrimitive.putAll(oldNode.getKeys()); - oldPrimitive.setCoor(oldNode.getCoor()); + // Technically a writeLock would be better, but we cannot get that with the current VectorDataSet + // implementation. + final Lock dsLock = ds.getReadLock(); + try { + dsLock.lock(); + for (MapillarySequence seq : chunks) { + for (MapillaryNode oldNode : seq.getNodes()) { + VectorNode oldPrimitive = (VectorNode) ds.getPrimitiveById(oldNode); + if (oldPrimitive != null) { + oldPrimitive.putAll(oldNode.getKeys()); + oldPrimitive.setCoor(oldNode.getCoor()); + } } } + } finally { + dsLock.unlock(); } // The counter just avoids many resets of the imagery window in short order if (!chunks.isEmpty() && counter.getAndAdd(chunks.size()) < 3) {