fix race condition between HWUI cache and renderThread

getMaximumBitmapWidth() and getMaximumBitmapHeight() of DisplayListCanvas
need HWUI cache instance. Since the initialization of the cache is
asynchronous it may crash if not yet ready. Add a staticFence() call
to guarantee the cache has been created prior issuing the call.

Change-Id: I5ed9e5cc084444c8d1872a77fef50e294ae14e93
Signed-off-by: Thomas Buhot <thomas.buhot@intel.com>
Signed-off-by: Zhiquan Liu <zhiquan.liu@intel.com>
This commit is contained in:
Thomas Buhot
2016-01-18 10:31:58 +01:00
committed by Zhiquan Liu
parent dbf8c17bd2
commit c0a0e1a66d
3 changed files with 13 additions and 0 deletions

View File

@@ -102,10 +102,16 @@ static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobje
// ----------------------------------------------------------------------------
static jint android_view_DisplayListCanvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
if (!Caches::hasInstance()) {
android::uirenderer::renderthread::RenderProxy::staticFence();
}
return Caches::getInstance().maxTextureSize;
}
static jint android_view_DisplayListCanvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
if (!Caches::hasInstance()) {
android::uirenderer::renderthread::RenderProxy::staticFence();
}
return Caches::getInstance().maxTextureSize;
}

View File

@@ -385,6 +385,12 @@ void RenderProxy::fence() {
postAndWait(task);
}
void RenderProxy::staticFence() {
SETUP_TASK(fence);
UNUSED(args);
staticPostAndWait(task);
}
CREATE_BRIDGE1(stopDrawing, CanvasContext* context) {
args->context->stopDrawing();
return nullptr;

View File

@@ -94,6 +94,7 @@ public:
ANDROID_API static void overrideProperty(const char* name, const char* value);
ANDROID_API void fence();
ANDROID_API static void staticFence();
ANDROID_API void stopDrawing();
ANDROID_API void notifyFramePending();