Ticket #13442: patch-dataset-locking.patch

File patch-dataset-locking.patch, 2.3 KB (added by michael2402, 6 years ago)
  • src/org/openstreetmap/josm/data/osm/DataSet.java

    diff --git a/src/org/openstreetmap/josm/data/osm/DataSet.java b/src/org/openstreetmap/josm/data/osm/DataSet.java
    index 4d24417..ae31a3a 100644
    a b public final class DataSet implements Data, Cloneable, ProjectionChangeListener 
    11601160    public void endUpdate() {
    11611161        if (updateCount > 0) {
    11621162            updateCount--;
     1163            List<AbstractDatasetChangedEvent> eventsToFire = Collections.emptyList();
    11631164            if (updateCount == 0) {
    1164                 List<AbstractDatasetChangedEvent> eventsCopy = new ArrayList<>(cachedEvents);
     1165                eventsToFire = new ArrayList<>(cachedEvents);
    11651166                cachedEvents.clear();
    1166                 lock.writeLock().unlock();
     1167            }
    11671168
    1168                 if (!eventsCopy.isEmpty()) {
    1169                     lock.readLock().lock();
    1170                     try {
    1171                         if (eventsCopy.size() < MAX_SINGLE_EVENTS) {
    1172                             for (AbstractDatasetChangedEvent event: eventsCopy) {
    1173                                 fireEventToListeners(event);
    1174                             }
    1175                         } else if (eventsCopy.size() == MAX_EVENTS) {
    1176                             fireEventToListeners(new DataChangedEvent(this));
    1177                         } else {
    1178                             fireEventToListeners(new DataChangedEvent(this, eventsCopy));
     1169            if (!eventsToFire.isEmpty()) {
     1170                lock.readLock().lock();
     1171                lock.writeLock().unlock();
     1172                try {
     1173                    if (eventsToFire.size() < MAX_SINGLE_EVENTS) {
     1174                        for (AbstractDatasetChangedEvent event: eventsToFire) {
     1175                            fireEventToListeners(event);
    11791176                        }
    1180                     } finally {
    1181                         lock.readLock().unlock();
     1177                    } else if (eventsToFire.size() == MAX_EVENTS) {
     1178                        fireEventToListeners(new DataChangedEvent(this));
     1179                    } else {
     1180                        fireEventToListeners(new DataChangedEvent(this, eventsToFire));
    11821181                    }
     1182                } finally {
     1183                    lock.readLock().unlock();
    11831184                }
    11841185            } else {
    11851186                lock.writeLock().unlock();