Skip to content

Commit d67b0d4

Browse files
committed
Fix #22961: CCE when updating a primitive
Signed-off-by: Taylor Smock <[email protected]>
1 parent e52c8b8 commit d67b0d4

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

src/main/java/org/openstreetmap/josm/plugins/mapillary/gui/workers/MapillarySequenceDownloader.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Objects;
1010
import java.util.concurrent.ExecutionException;
1111
import java.util.concurrent.atomic.AtomicInteger;
12+
import java.util.concurrent.locks.Lock;
1213
import java.util.function.Consumer;
1314
import java.util.stream.Collectors;
1415

@@ -175,14 +176,22 @@ protected void done() {
175176
protected void process(List<MapillarySequence> chunks) {
176177
super.process(chunks);
177178
VectorDataSet ds = MapillaryLayer.getInstance().getData();
178-
for (MapillarySequence seq : chunks) {
179-
for (MapillaryNode oldNode : seq.getNodes()) {
180-
VectorNode oldPrimitive = (VectorNode) ds.getPrimitiveById(oldNode);
181-
if (oldPrimitive != null) {
182-
oldPrimitive.putAll(oldNode.getKeys());
183-
oldPrimitive.setCoor(oldNode.getCoor());
179+
// Technically a writeLock would be better, but we cannot get that with the current VectorDataSet
180+
// implementation.
181+
final Lock dsLock = ds.getReadLock();
182+
try {
183+
dsLock.lock();
184+
for (MapillarySequence seq : chunks) {
185+
for (MapillaryNode oldNode : seq.getNodes()) {
186+
VectorNode oldPrimitive = (VectorNode) ds.getPrimitiveById(oldNode);
187+
if (oldPrimitive != null) {
188+
oldPrimitive.putAll(oldNode.getKeys());
189+
oldPrimitive.setCoor(oldNode.getCoor());
190+
}
184191
}
185192
}
193+
} finally {
194+
dsLock.unlock();
186195
}
187196
// The counter just avoids many resets of the imagery window in short order
188197
if (!chunks.isEmpty() && counter.getAndAdd(chunks.size()) < 3) {

0 commit comments

Comments
 (0)