From cdd7df92b0efdea578b32aa98276d20817c7c48e Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 12 Apr 2021 15:32:09 -0700 Subject: SurfaceFlinger::getNewTexture: Don't deadlock on main thread This codepath may be invoked on the main thread via the RefreshRateOverlay surface creation codepath. In such case it will trigger a deadlock as we wait on the main thread to complete while blocking the main thread. This can be observed by running RefreshRateOverlayTests with ~5 iterations. It seems safest to just avoid this deadlock. Bug: 184991996 Test: Existing tests pass Change-Id: I3c5c495b8e93761813157840c9878c73bcdee579 --- services/surfaceflinger/SurfaceFlinger.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 02579c6bde..82661eca68 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -693,12 +693,16 @@ uint32_t SurfaceFlinger::getNewTexture() { // The pool was empty, so we need to get a new texture name directly using a // blocking call to the main thread - return schedule([this] { + auto genTextures = [this] { uint32_t name = 0; getRenderEngine().genTextures(1, &name); return name; - }) - .get(); + }; + if (std::this_thread::get_id() == mMainThreadId) { + return genTextures(); + } else { + return schedule(genTextures).get(); + } } void SurfaceFlinger::deleteTextureAsync(uint32_t texture) { -- cgit v1.2.3-59-g8ed1b