Merge "hwc: Define and Use mSecureLock"
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 43bebac..f90420f 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -260,6 +260,7 @@
     ctx->mBlankLock.lock();
     //Will be unlocked at the end of set
     ctx->mExtLock.lock();
+    ctx->mSecureLock.lock();
     reset(ctx, numDisplays, displays);
 
     ctx->mOverlay->configBegin();
@@ -614,6 +615,7 @@
     MDPComp::resetIdleFallBack();
     ctx->mVideoTransFlag = false;
     //Was locked at the beginning of prepare
+    ctx->mSecureLock.unlock();
     ctx->mExtLock.unlock();
     ctx->mBlankLock.unlock();
     return ret;
diff --git a/libhwcomposer/hwc_qclient.cpp b/libhwcomposer/hwc_qclient.cpp
index b27a88c..c20f5c1 100644
--- a/libhwcomposer/hwc_qclient.cpp
+++ b/libhwcomposer/hwc_qclient.cpp
@@ -71,6 +71,7 @@
 }
 
 void QClient::securing(uint32_t startEnd) {
+    Locker::Autolock _sl(mHwcContext->mSecureLock);
     //The only way to make this class in this process subscribe to media
     //player's death.
     IMediaDeathNotifier::getMediaPlayerService();
@@ -84,6 +85,7 @@
 }
 
 void QClient::unsecuring(uint32_t startEnd) {
+    Locker::Autolock _sl(mHwcContext->mSecureLock);
     mHwcContext->mSecuring = startEnd;
     //We're done unsecuring
     if(startEnd == IQService::END)
@@ -93,6 +95,7 @@
 }
 
 void QClient::MPDeathNotifier::died() {
+    Locker::Autolock _sl(mHwcContext->mSecureLock);
     ALOGD_IF(QCLIENT_DEBUG, "Media Player died");
     mHwcContext->mSecuring = false;
     mHwcContext->mSecureMode = false;
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 9a7ef0d..7b39ae5 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -346,6 +346,13 @@
     mutable Locker mBlankLock;
     //Lock to protect prepare & set when detaching external disp
     mutable Locker mExtLock;
+    /*Lock to set both mSecureMode and mSecuring as part
+      of binder thread without context switch to composition
+      thread. This lock is needed only for A-family targets
+      since the state of mSecureMode and mSecuring variables
+      are not checked in B-family targets.
+    */
+    mutable Locker mSecureLock;
     //Drawing round when we use GPU
     bool isPaddingRound;
     // External Orientation