hwc: Release DrawLock before calling invalidate
Release Drawlock before calling invalidate to avoid
deadlock between caller thread and the draw thread.
Change-Id: Iddf9c3a554016d6493b336ec654f6f32bf57506a
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index ba7793e..fc9600e 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -214,17 +214,21 @@
ALOGE("%s: received empty data in timer callback", __FUNCTION__);
return;
}
- Locker::Autolock _l(ctx->mDrawLock);
+
+ ctx->mDrawLock.lock();
// Handle timeout event only if the previous composition is MDP or MIXED.
if(!sHandleTimeout) {
ALOGD_IF(isDebug(), "%s:Do not handle this timeout", __FUNCTION__);
+ ctx->mDrawLock.unlock();
return;
}
if(!ctx->proc) {
ALOGE("%s: HWC proc not registered", __FUNCTION__);
+ ctx->mDrawLock.unlock();
return;
}
sIdleFallBack = true;
+ ctx->mDrawLock.unlock();
/* Trigger SF to redraw the current frame */
ctx->proc->invalidate(ctx->proc);
}
diff --git a/libhwcomposer/hwc_qclient.cpp b/libhwcomposer/hwc_qclient.cpp
index 1a29b89..f761085 100644
--- a/libhwcomposer/hwc_qclient.cpp
+++ b/libhwcomposer/hwc_qclient.cpp
@@ -59,34 +59,39 @@
}
static void securing(hwc_context_t *ctx, uint32_t startEnd) {
- Locker::Autolock _sl(ctx->mDrawLock);
//The only way to make this class in this process subscribe to media
//player's death.
IMediaDeathNotifier::getMediaPlayerService();
+ ctx->mDrawLock.lock();
ctx->mSecuring = startEnd;
//We're done securing
if(startEnd == IQService::END)
ctx->mSecureMode = true;
+ ctx->mDrawLock.unlock();
+
if(ctx->proc)
ctx->proc->invalidate(ctx->proc);
}
static void unsecuring(hwc_context_t *ctx, uint32_t startEnd) {
- Locker::Autolock _sl(ctx->mDrawLock);
+ ctx->mDrawLock.lock();
ctx->mSecuring = startEnd;
//We're done unsecuring
if(startEnd == IQService::END)
ctx->mSecureMode = false;
+ ctx->mDrawLock.unlock();
+
if(ctx->proc)
ctx->proc->invalidate(ctx->proc);
}
void QClient::MPDeathNotifier::died() {
- Locker::Autolock _sl(mHwcContext->mDrawLock);
+ mHwcContext->mDrawLock.lock();
ALOGD_IF(QCLIENT_DEBUG, "Media Player died");
mHwcContext->mSecuring = false;
mHwcContext->mSecureMode = false;
+ mHwcContext->mDrawLock.unlock();
if(mHwcContext->proc)
mHwcContext->proc->invalidate(mHwcContext->proc);
}
@@ -315,8 +320,8 @@
static void toggleScreenUpdate(hwc_context_t* ctx, uint32_t on) {
ALOGD("%s: toggle update: %d", __FUNCTION__, on);
- Locker::Autolock _sl(ctx->mDrawLock);
if (on == 0) {
+ ctx->mDrawLock.lock();
ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isPause = true;
ctx->mOverlay->configBegin();
ctx->mOverlay->configDone();
@@ -324,8 +329,11 @@
if(!Overlay::displayCommit(ctx->dpyAttr[0].fd)) {
ALOGE("%s: Display commit failed", __FUNCTION__);
}
+ ctx->mDrawLock.unlock();
} else {
+ ctx->mDrawLock.lock();
ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isPause = false;
+ ctx->mDrawLock.unlock();
ctx->proc->invalidate(ctx->proc);
}
}