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
This commit is contained in:
Hannes Janetzek 2014-01-19 16:09:39 +01:00
parent 348e63b4fb
commit 0710e5776e

View File

@ -23,16 +23,10 @@ import android.widget.RelativeLayout.LayoutParams;
public class AndroidMap extends Map { public class AndroidMap extends Map {
private final MapView mMapView; private final MapView mMapView;
private boolean mWaitRedraw;
final GLView mGLView; final GLView mGLView;
boolean mPausing = false;
private final Runnable mRedrawRequest = new Runnable() { private volatile boolean mWaitRedraw;
@Override private volatile boolean mPausing;
public void run() {
redrawMapInternal(false);
}
};
public AndroidMap(MapView mapView) { public AndroidMap(MapView mapView) {
super(); super();
@ -45,8 +39,6 @@ public class AndroidMap extends Map {
android.view.ViewGroup.LayoutParams.MATCH_PARENT); android.view.ViewGroup.LayoutParams.MATCH_PARENT);
mapView.addView(mGLView, params); mapView.addView(mGLView, params);
//mGestureDetector =
} }
@Override @Override
@ -60,9 +52,9 @@ public class AndroidMap extends Map {
} }
@Override @Override
public synchronized void updateMap(boolean requestRender) { public void updateMap(boolean redraw) {
if (requestRender && !mClearMap && !mPausing) // && mInitialized) //if (redraw && !mClearMap && !mPausing)
mGLView.requestRender(); // mGLView.requestRender();
if (!mWaitRedraw) { if (!mWaitRedraw) {
mWaitRedraw = true; mWaitRedraw = true;
@ -71,26 +63,29 @@ public class AndroidMap extends Map {
} }
@Override @Override
public synchronized void render() { public void render() {
if (mPausing)
return;
if (mClearMap) if (mClearMap)
updateMap(false); updateMap(false);
else else
mGLView.requestRender(); mGLView.requestRender();
} }
synchronized void redrawMapInternal(boolean forceRedraw) { private final Runnable mRedrawRequest = new Runnable() {
boolean clear = mClearMap; @Override
mWaitRedraw = false; public void run() {
redrawMapInternal();
}
};
if (forceRedraw && !clear) void redrawMapInternal() {
mGLView.requestRender(); mWaitRedraw = false;
updateLayers(); updateLayers();
if (clear) { mGLView.requestRender();
mGLView.requestRender();
mClearMap = false;
}
} }
@Override @Override
@ -103,9 +98,7 @@ public class AndroidMap extends Map {
return mMapView.postDelayed(action, delay); return mMapView.postDelayed(action, delay);
} }
public void pause(boolean pause) {
public synchronized void pause(boolean pause) { mPausing = pause;
mPausing = pause; }
}
} }