summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Thomas <steventhomas@google.com>2017-09-30 00:51:21 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-09-30 00:51:21 +0000
commitc026c52ee67c7019a8018e2a5ec05d32b208ed94 (patch)
treed449f9574085b121c68f89198f8df6ca921228a0
parent17209ec9e22478771f605963418ce6fa319dafd3 (diff)
parentbe6cbae3b61a55ab87c131e79dba03d159961aa3 (diff)
downloadnative-c026c52ee67c7019a8018e2a5ec05d32b208ed94.tar.gz
Merge "Fix deadlock when transitioning to vr flinger" into oc-mr1-dev
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 12205af919..c05ac8aaac 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -604,11 +604,18 @@ void SurfaceFlinger::init() {
if (useVrFlinger) {
auto vrFlingerRequestDisplayCallback = [this] (bool requestDisplay) {
- ALOGI("VR request display mode: requestDisplay=%d", requestDisplay);
- mVrFlingerRequestsDisplay = requestDisplay;
- ConditionalLock _l(mStateLock,
- std::this_thread::get_id() != mMainThreadId);
- signalTransaction();
+ // This callback is called from the vr flinger dispatch thread. We
+ // need to call signalTransaction(), which requires holding
+ // mStateLock when we're not on the main thread. Acquiring
+ // mStateLock from the vr flinger dispatch thread might trigger a
+ // deadlock in surface flinger (see b/66916578), so post a message
+ // to be handled on the main thread instead.
+ sp<LambdaMessage> message = new LambdaMessage([=]() {
+ ALOGI("VR request display mode: requestDisplay=%d", requestDisplay);
+ mVrFlingerRequestsDisplay = requestDisplay;
+ signalTransaction();
+ });
+ postMessageAsync(message);
};
mVrFlinger = dvr::VrFlinger::Create(mHwc->getComposer(),
vrFlingerRequestDisplayCallback);