From 0710e5776e8c5ece38341626764c8e043d91e27d Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 19 Jan 2014 16:09:39 +0100 Subject: [PATCH] fix deadlock on AndroidMap<>Viewport: - on GL-Thread: MapRenderer.draw()->MapAnimator->update()->AndroidMap.updateMap [sync: Viewport [sync: AndroidMap ]] - on Mainloop: AndroidMap.redrawMapInternal()->updateLayers()->Viewport.getMapPosition() [sync:AndroidMap [sync:Viewport]] ... no need to sync on AndroidMap --- .../src/org/oscim/android/AndroidMap.java | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/vtm-android/src/org/oscim/android/AndroidMap.java b/vtm-android/src/org/oscim/android/AndroidMap.java index e8d70966..e29d2a52 100644 --- a/vtm-android/src/org/oscim/android/AndroidMap.java +++ b/vtm-android/src/org/oscim/android/AndroidMap.java @@ -23,16 +23,10 @@ import android.widget.RelativeLayout.LayoutParams; public class AndroidMap extends Map { private final MapView mMapView; - private boolean mWaitRedraw; final GLView mGLView; - boolean mPausing = false; - private final Runnable mRedrawRequest = new Runnable() { - @Override - public void run() { - redrawMapInternal(false); - } - }; + private volatile boolean mWaitRedraw; + private volatile boolean mPausing; public AndroidMap(MapView mapView) { super(); @@ -45,8 +39,6 @@ public class AndroidMap extends Map { android.view.ViewGroup.LayoutParams.MATCH_PARENT); mapView.addView(mGLView, params); - - //mGestureDetector = } @Override @@ -60,9 +52,9 @@ public class AndroidMap extends Map { } @Override - public synchronized void updateMap(boolean requestRender) { - if (requestRender && !mClearMap && !mPausing) // && mInitialized) - mGLView.requestRender(); + public void updateMap(boolean redraw) { + //if (redraw && !mClearMap && !mPausing) + // mGLView.requestRender(); if (!mWaitRedraw) { mWaitRedraw = true; @@ -71,26 +63,29 @@ public class AndroidMap extends Map { } @Override - public synchronized void render() { + public void render() { + if (mPausing) + return; + if (mClearMap) updateMap(false); else mGLView.requestRender(); } - synchronized void redrawMapInternal(boolean forceRedraw) { - boolean clear = mClearMap; - mWaitRedraw = false; + private final Runnable mRedrawRequest = new Runnable() { + @Override + public void run() { + redrawMapInternal(); + } + }; - if (forceRedraw && !clear) - mGLView.requestRender(); + void redrawMapInternal() { + mWaitRedraw = false; updateLayers(); - if (clear) { - mGLView.requestRender(); - mClearMap = false; - } + mGLView.requestRender(); } @Override @@ -103,9 +98,7 @@ public class AndroidMap extends Map { return mMapView.postDelayed(action, delay); } - - public synchronized void pause(boolean pause) { - mPausing = pause; - } - + public void pause(boolean pause) { + mPausing = pause; + } }