fix concurrency bug: use a copy of RenderOverlays

This commit is contained in:
Hannes Janetzek 2013-04-08 18:07:14 +02:00
parent 0e62d375dd
commit 29c3f42043
2 changed files with 20 additions and 14 deletions

View File

@ -17,8 +17,6 @@
package org.oscim.overlay; package org.oscim.overlay;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
@ -66,9 +64,9 @@ public class OverlayManager extends AbstractList<Overlay> {
} }
private boolean mDirtyOverlays; private boolean mDirtyOverlays;
private final List<RenderOverlay> mDrawLayers = new ArrayList<RenderOverlay>(); private RenderOverlay[] mDrawLayers;
public List<RenderOverlay> getRenderLayers() { public RenderOverlay[] getRenderLayers() {
if (mDirtyOverlays) if (mDirtyOverlays)
updateOverlays(); updateOverlays();
@ -91,14 +89,23 @@ public class OverlayManager extends AbstractList<Overlay> {
mOverlays = new Overlay[mOverlayList.size()]; mOverlays = new Overlay[mOverlayList.size()];
mDrawLayers.clear(); int numRenderLayers = 0;
for (int i = 0, n = mOverlayList.size(); i < n; i++) { for (int i = 0, n = mOverlayList.size(); i < n; i++) {
Overlay o = mOverlayList.get(i);
if (o.getLayer() != null)
numRenderLayers++;
mOverlays[n - i - 1] = o;
}
mDrawLayers = new RenderOverlay[numRenderLayers];
for (int i = 0, cnt = 0, n = mOverlayList.size(); i < n; i++) {
Overlay o = mOverlayList.get(i); Overlay o = mOverlayList.get(i);
RenderOverlay l = o.getLayer(); RenderOverlay l = o.getLayer();
if (l != null) if (l != null)
mDrawLayers.add(l); mDrawLayers[cnt++] = l;
mOverlays[n - i - 1] = o;
} }
mDirtyOverlays = false; mDirtyOverlays = false;

View File

@ -24,7 +24,6 @@ import static org.oscim.generator.JobTile.STATE_READY;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLConfig;
@ -483,17 +482,17 @@ public class GLRenderer implements GLSurfaceView.Renderer {
tilesChanged |= (uploadCnt > 0); tilesChanged |= (uploadCnt > 0);
/* update overlays */ /* update overlays */
List<RenderOverlay> overlays = mMapView.getOverlayManager().getRenderLayers(); RenderOverlay[] overlays = mMapView.getOverlayManager().getRenderLayers();
for (int i = 0, n = overlays.size(); i < n; i++) for (int i = 0, n = overlays.length; i < n; i++)
overlays.get(i).update(mMapPosition, positionChanged, tilesChanged, mMatrices); overlays[i].update(mMapPosition, positionChanged, tilesChanged, mMatrices);
/* draw base layer */ /* draw base layer */
TileRenderer.draw(tiles, tileCnt, pos, mMatrices); TileRenderer.draw(tiles, tileCnt, pos, mMatrices);
/* draw overlays */ /* draw overlays */
for (int i = 0, n = overlays.size(); i < n; i++) { for (int i = 0, n = overlays.length; i < n; i++) {
RenderOverlay renderOverlay = overlays.get(i); RenderOverlay renderOverlay = overlays[i];
if (renderOverlay.newData) { if (renderOverlay.newData) {
renderOverlay.compile(); renderOverlay.compile();