Fix a Truly Ancient (TM) bug.
The Scene Resolver thread and the dobj/AWT thread both talk to the _blocks map. And if the resolver tried to get while someone else was doing a put(), that put could decide to resize/rearrange the map. Which could result in the resolver not finding its block. Which resulted in annoying missing tile blocks. So - ConcurrentHashMap it up. Woo! git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@894 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -47,6 +47,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JFrame;
|
||||
@@ -1532,7 +1533,8 @@ public class MisoScenePanel extends VirtualMediaPanel
|
||||
protected RethinkOp _rethinkOp;
|
||||
|
||||
/** Contains our scene blocks. See {@link #getBlock} for details. */
|
||||
protected HashIntMap<SceneBlock> _blocks = new HashIntMap<SceneBlock>();
|
||||
protected ConcurrentHashMap<Integer, SceneBlock> _blocks =
|
||||
new ConcurrentHashMap<Integer, SceneBlock>();
|
||||
|
||||
/** A count of blocks in the process of being resolved. */
|
||||
protected int _pendingBlocks;
|
||||
|
||||
@@ -33,7 +33,6 @@ import java.awt.Rectangle;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import com.samskivert.util.ArrayUtil;
|
||||
import com.samskivert.util.IntMap;
|
||||
import com.samskivert.util.StringUtil;
|
||||
|
||||
import com.threerings.media.tile.NoSuchTileSetException;
|
||||
@@ -513,7 +512,7 @@ public class SceneBlock
|
||||
* Links this block to its neighbors; informs neighboring blocks of
|
||||
* object coverage.
|
||||
*/
|
||||
protected void update (IntMap<SceneBlock> blocks)
|
||||
protected void update (Map<Integer, SceneBlock> blocks)
|
||||
{
|
||||
boolean recover = false;
|
||||
|
||||
@@ -557,7 +556,7 @@ public class SceneBlock
|
||||
/**
|
||||
* Sets the footprint of this object tile
|
||||
*/
|
||||
protected void setCovered (IntMap<SceneBlock> blocks, SceneObject scobj)
|
||||
protected void setCovered (Map<Integer, SceneBlock> blocks, SceneObject scobj)
|
||||
{
|
||||
int endx = scobj.info.x - scobj.tile.getBaseWidth() + 1;
|
||||
int endy = scobj.info.y - scobj.tile.getBaseHeight() + 1;
|
||||
|
||||
Reference in New Issue
Block a user