From 29c3f420436823f08103d682fd403f29830b16ae Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 8 Apr 2013 18:07:14 +0200 Subject: [PATCH] fix concurrency bug: use a copy of RenderOverlays --- src/org/oscim/overlay/OverlayManager.java | 23 +++++++++++++++-------- src/org/oscim/renderer/GLRenderer.java | 11 +++++------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/org/oscim/overlay/OverlayManager.java b/src/org/oscim/overlay/OverlayManager.java index 58537da3..178f0b38 100644 --- a/src/org/oscim/overlay/OverlayManager.java +++ b/src/org/oscim/overlay/OverlayManager.java @@ -17,8 +17,6 @@ package org.oscim.overlay; import java.util.AbstractList; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.oscim.core.MapPosition; @@ -66,9 +64,9 @@ public class OverlayManager extends AbstractList { } private boolean mDirtyOverlays; - private final List mDrawLayers = new ArrayList(); + private RenderOverlay[] mDrawLayers; - public List getRenderLayers() { + public RenderOverlay[] getRenderLayers() { if (mDirtyOverlays) updateOverlays(); @@ -91,14 +89,23 @@ public class OverlayManager extends AbstractList { mOverlays = new Overlay[mOverlayList.size()]; - mDrawLayers.clear(); + int numRenderLayers = 0; + 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); RenderOverlay l = o.getLayer(); if (l != null) - mDrawLayers.add(l); - - mOverlays[n - i - 1] = o; + mDrawLayers[cnt++] = l; } mDirtyOverlays = false; diff --git a/src/org/oscim/renderer/GLRenderer.java b/src/org/oscim/renderer/GLRenderer.java index 5279ddbe..ca97a90b 100644 --- a/src/org/oscim/renderer/GLRenderer.java +++ b/src/org/oscim/renderer/GLRenderer.java @@ -24,7 +24,6 @@ import static org.oscim.generator.JobTile.STATE_READY; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.ShortBuffer; -import java.util.List; import java.util.concurrent.locks.ReentrantLock; import javax.microedition.khronos.egl.EGLConfig; @@ -483,17 +482,17 @@ public class GLRenderer implements GLSurfaceView.Renderer { tilesChanged |= (uploadCnt > 0); /* update overlays */ - List overlays = mMapView.getOverlayManager().getRenderLayers(); + RenderOverlay[] overlays = mMapView.getOverlayManager().getRenderLayers(); - for (int i = 0, n = overlays.size(); i < n; i++) - overlays.get(i).update(mMapPosition, positionChanged, tilesChanged, mMatrices); + for (int i = 0, n = overlays.length; i < n; i++) + overlays[i].update(mMapPosition, positionChanged, tilesChanged, mMatrices); /* draw base layer */ TileRenderer.draw(tiles, tileCnt, pos, mMatrices); /* draw overlays */ - for (int i = 0, n = overlays.size(); i < n; i++) { - RenderOverlay renderOverlay = overlays.get(i); + for (int i = 0, n = overlays.length; i < n; i++) { + RenderOverlay renderOverlay = overlays[i]; if (renderOverlay.newData) { renderOverlay.compile();