Ignore:
Timestamp:
2013-08-04T15:18:31+02:00 (11 years ago)
Author:
bastik
Message:

[JMapViewer] fixed #josm8200 - NPE when flushing tile cache

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/MemoryTileCache.java

    r29731 r29822  
    33//License: GPL. Copyright 2008 by Jan Peter Stotz
    44
    5 import java.util.Hashtable;
     5import java.util.HashMap;
     6import java.util.Map;
    67import java.util.logging.Logger;
    78
     
    2526    protected int cacheSize = 200;
    2627
    27     protected Hashtable<String, CacheEntry> hashtable;
     28    protected final Map<String, CacheEntry> hash;
    2829
    2930    /**
    3031     * List of all tiles in their last recently used order
    3132     */
    32     protected CacheLinkedListElement lruTiles;
     33    protected final CacheLinkedListElement lruTiles;
    3334
    3435    public MemoryTileCache() {
    35         hashtable = new Hashtable<String, CacheEntry>(cacheSize);
     36        hash = new HashMap<String, CacheEntry>(cacheSize);
    3637        lruTiles = new CacheLinkedListElement();
    3738    }
    3839
    3940    @Override
    40     public void addTile(Tile tile) {
     41    public synchronized void addTile(Tile tile) {
    4142        CacheEntry entry = createCacheEntry(tile);
    42         hashtable.put(tile.getKey(), entry);
    43         lruTiles.addFirst(entry);
    44         if (hashtable.size() > cacheSize)
    45             removeOldEntries();
     43            hash.put(tile.getKey(), entry);
     44            lruTiles.addFirst(entry);
     45            if (hash.size() > cacheSize) {
     46                removeOldEntries();
     47            }
    4648    }
    4749
    4850    @Override
    49     public Tile getTile(TileSource source, int x, int y, int z) {
    50         CacheEntry entry = hashtable.get(Tile.getTileKey(source, x, y, z));
     51    public synchronized Tile getTile(TileSource source, int x, int y, int z) {
     52        CacheEntry entry = hash.get(Tile.getTileKey(source, x, y, z));
    5153        if (entry == null)
    5254            return null;
     
    6163     * Removes the least recently used tiles
    6264     */
    63     protected void removeOldEntries() {
    64         synchronized (lruTiles) {
    65             try {
    66                 while (lruTiles.getElementCount() > cacheSize) {
    67                     removeEntry(lruTiles.getLastElement());
    68                 }
    69             } catch (Exception e) {
    70                 log.warning(e.getMessage());
    71             }
    72         }
    73     }
    74 
    75     protected void removeEntry(CacheEntry entry) {
    76         hashtable.remove(entry.tile.getKey());
     65    protected synchronized void removeOldEntries() {
     66        try {
     67            while (lruTiles.getElementCount() > cacheSize) {
     68                removeEntry(lruTiles.getLastElement());
     69            }
     70        } catch (Exception e) {
     71            log.warning(e.getMessage());
     72        }
     73    }
     74
     75    protected synchronized void removeEntry(CacheEntry entry) {
     76        hash.remove(entry.tile.getKey());
    7777        lruTiles.removeEntry(entry);
    7878    }
     
    8585     * Clears the cache deleting all tiles from memory
    8686     */
    87     public void clear() {
    88         synchronized (lruTiles) {
    89             hashtable.clear();
    90             lruTiles.clear();
    91         }
     87    public synchronized void clear() {
     88        hash.clear();
     89        lruTiles.clear();
    9290    }
    9391
    9492    @Override
    9593    public int getTileCount() {
    96         return hashtable.size();
     94        return hash.size();
    9795    }
    9896
     
    107105     *            new maximum number of tiles
    108106     */
    109     public void setCacheSize(int cacheSize) {
     107    public synchronized void setCacheSize(int cacheSize) {
    110108        this.cacheSize = cacheSize;
    111         if (hashtable.size() > cacheSize)
     109        if (hash.size() > cacheSize)
    112110            removeOldEntries();
    113111    }
     
    157155        }
    158156
    159         public synchronized void clear() {
     157        public void clear() {
    160158            elementCount = 0;
    161159            firstElement = null;
     
    168166         * @param element new element to be added
    169167         */
    170         public synchronized void addFirst(CacheEntry element) {
     168        public void addFirst(CacheEntry element) {
    171169            if (element == null) return;
    172170            if (elementCount == 0) {
     
    189187         * @param element element to be removed
    190188         */
    191         public synchronized void removeEntry(CacheEntry element) {
     189        public void removeEntry(CacheEntry element) {
    192190            if (element == null) return;
    193191            if (element.next != null) {
     
    206204        }
    207205
    208         public synchronized void moveElementToFirstPos(CacheEntry entry) {
     206        public void moveElementToFirstPos(CacheEntry entry) {
    209207            if (firstElement == entry)
    210208                return;
Note: See TracChangeset for help on using the changeset viewer.