diff options
author | Steven Thomas <steventhomas@google.com> | 2017-09-30 00:51:21 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-09-30 00:51:21 +0000 |
commit | c026c52ee67c7019a8018e2a5ec05d32b208ed94 (patch) | |
tree | d449f9574085b121c68f89198f8df6ca921228a0 | |
parent | 17209ec9e22478771f605963418ce6fa319dafd3 (diff) | |
parent | be6cbae3b61a55ab87c131e79dba03d159961aa3 (diff) | |
download | native-c026c52ee67c7019a8018e2a5ec05d32b208ed94.tar.gz |
Merge "Fix deadlock when transitioning to vr flinger" into oc-mr1-dev
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 17 |
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); |