Ticket #11632: 0006-Synchronized-access-to-temporary-layers-and-added-a-.patch

File 0006-Synchronized-access-to-temporary-layers-and-added-a-.patch, 3.9 KB (added by michael2402, 8 years ago)
  • src/org/openstreetmap/josm/gui/MapView.java

    From 4e45e377f130af94ab4388230eb1d09f477778bd Mon Sep 17 00:00:00 2001
    From: Michael Zangl <michael.zangl@student.kit.edu>
    Date: Wed, 1 Jul 2015 14:41:30 +0200
    Subject: [PATCH 6/8] Synchronized access to temporary layers and added a
     getter.
    
    ---
     src/org/openstreetmap/josm/gui/MapView.java | 52 ++++++++++++++++++++++++-----
     1 file changed, 44 insertions(+), 8 deletions(-)
    
    diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
    index a32db86..4e2dee0 100644
    a b import java.beans.PropertyChangeListener; 
    2424import java.util.ArrayList;
    2525import java.util.Collection;
    2626import java.util.Collections;
    27 import java.util.LinkedList;
     27import java.util.LinkedHashSet;
    2828import java.util.List;
    2929import java.util.ListIterator;
     30import java.util.Set;
    3031import java.util.concurrent.CopyOnWriteArrayList;
    3132import java.util.concurrent.locks.ReentrantReadWriteLock;
    3233
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer 
    264265     */
    265266    public MouseEvent lastMEvent = new MouseEvent(this, 0, 0, 0, 0, 0, 0, false); // In case somebody reads it before first mouse move
    266267
    267     private final transient List<MapViewPaintable> temporaryLayers = new LinkedList<>();
     268    private final transient Set<MapViewPaintable> temporaryLayers = new LinkedHashSet<>();
     269
     270    /**
     271     * This is a mutex that locks changes to {@link #temporaryLayers}
     272     */
     273    private final transient Object temporaryLayersMutex = new Object();
    268274
    269275    private transient BufferedImage nonChangedLayersBuffer;
    270276    private transient BufferedImage offscreenBuffer;
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer 
    777783            paintLayer(visibleLayers.get(i), tempG, box);
    778784        }
    779785
    780         for (MapViewPaintable mvp : temporaryLayers) {
    781             mvp.paint(tempG, this, box);
     786        synchronized (temporaryLayersMutex) {
     787            for (MapViewPaintable mvp : temporaryLayers) {
     788                mvp.paint(tempG, this, box);
     789            }
    782790        }
    783791
    784792        // draw world borders
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer 
    10581066        }
    10591067    }
    10601068
     1069    /**
     1070     * Adds a new temporary layer.
     1071     * <p>
     1072     * A temporary layer is a layer that is painted above all normal layers. Layers are painted in the order they are added.
     1073     *
     1074     * @param mvp The layer to paint.
     1075     * @return <code>true</code> if the layer was added.
     1076     */
    10611077    public boolean addTemporaryLayer(MapViewPaintable mvp) {
    1062         if (temporaryLayers.contains(mvp)) return false;
    1063         return temporaryLayers.add(mvp);
     1078        synchronized (temporaryLayersMutex) {
     1079            return temporaryLayers.add(mvp);
     1080        }
    10641081    }
    10651082
     1083    /**
     1084     * Removes a layer previously added as temporary layer.
     1085     * @param mvp The layer to remove.
     1086     * @return <code>true</code> if that layer was removed.
     1087     */
    10661088    public boolean removeTemporaryLayer(MapViewPaintable mvp) {
    1067         return temporaryLayers.remove(mvp);
     1089        synchronized (temporaryLayersMutex) {
     1090            return temporaryLayers.remove(mvp);
     1091        }
     1092    }
     1093
     1094    /**
     1095     * Gets a list of temporary layers.
     1096     * @return The layers in the order they are added.
     1097     */
     1098    public List<MapViewPaintable> getTemporaryLayers() {
     1099        synchronized (temporaryLayersMutex) {
     1100            return Collections.unmodifiableList(new ArrayList<>(temporaryLayers));
     1101        }
    10681102    }
    10691103
    10701104    @Override
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer 
    11351169            layerLock.writeLock().unlock();
    11361170        }
    11371171        nonChangedLayers.clear();
    1138         temporaryLayers.clear();
     1172        synchronized (temporaryLayersMutex) {
     1173            temporaryLayers.clear();
     1174        }
    11391175    }
    11401176
    11411177    @Override