runelite-client: Make ItemManager's price update thread safe

This commit is contained in:
Max Weber
2018-08-01 22:00:05 -06:00
committed by Tomas Slusny
parent 6cd71a9a34
commit 594573faeb

View File

@@ -27,12 +27,13 @@ package net.runelite.client.game;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap; import java.util.Collections;
import java.util.concurrent.ConcurrentMap; import java.util.Map;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -77,7 +78,7 @@ public class ItemManager
private final ItemClient itemClient = new ItemClient(); private final ItemClient itemClient = new ItemClient();
private final LoadingCache<String, SearchResult> itemSearches; private final LoadingCache<String, SearchResult> itemSearches;
private final ConcurrentMap<Integer, ItemPrice> itemPrices = new ConcurrentHashMap<>(); private Map<Integer, ItemPrice> itemPrices = Collections.emptyMap();
private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages; private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages;
private final LoadingCache<Integer, ItemComposition> itemCompositions; private final LoadingCache<Integer, ItemComposition> itemCompositions;
private final LoadingCache<OutlineKey, BufferedImage> itemOutlines; private final LoadingCache<OutlineKey, BufferedImage> itemOutlines;
@@ -147,11 +148,12 @@ public class ItemManager
ItemPrice[] prices = itemClient.getPrices(); ItemPrice[] prices = itemClient.getPrices();
if (prices != null) if (prices != null)
{ {
itemPrices.clear(); ImmutableMap.Builder<Integer, ItemPrice> map = ImmutableMap.builderWithExpectedSize(prices.length);
for (ItemPrice price : prices) for (ItemPrice price : prices)
{ {
itemPrices.put(price.getItem().getId(), price); map.put(price.getItem().getId(), price);
} }
itemPrices = map.build();
} }
log.debug("Loaded {} prices", itemPrices.size()); log.debug("Loaded {} prices", itemPrices.size());