From b123f47bbde4d30be44ca02fc369f6ff83dbff8f Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Mon, 22 Jun 2020 11:52:39 -0700 Subject: Call Layer::getLayerDebugInfo from the main thread Fixes an issue where drawing state could be accessed from a binder thread. The function also mixed current state with drawing state incorrectly. The function now only retrieves drawing state. Bug: 150226608 Test: Steps in bug doesn't repro Test: atest sffakehwc_test Merged-In: I5537c53e8214e2785473839d71fd483d1a3219b6 Change-Id: I04daedcb9a890083cc710bab30b295e14b9872ae --- services/surfaceflinger/Layer.cpp | 2 +- services/surfaceflinger/SurfaceFlinger.cpp | 19 ++++++------------- services/surfaceflinger/SurfaceFlinger.h | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) (limited to 'services') diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 1318bc0b2a..fccaf8166d 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1280,7 +1280,7 @@ LayerDebugInfo Layer::getLayerDebugInfo() const { LayerDebugInfo info; const State& ds = getDrawingState(); info.mName = getName(); - sp parent = getParent(); + sp parent = mDrawingParent.promote(); info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string()); info.mType = std::string(getTypeId()); info.mTransparentRegion = ds.activeTransparentRegion_legacy; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 6166789fc4..1a25b8230e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1284,22 +1284,15 @@ status_t SurfaceFlinger::injectVSync(nsecs_t when) { return NO_ERROR; } -status_t SurfaceFlinger::getLayerDebugInfo(std::vector* outLayers) const +status_t SurfaceFlinger::getLayerDebugInfo(std::vector* outLayers) NO_THREAD_SAFETY_ANALYSIS { - // Try to acquire a lock for 1s, fail gracefully - const status_t err = mStateLock.timedLock(s2ns(1)); - const bool locked = (err == NO_ERROR); - if (!locked) { - ALOGE("LayerDebugInfo: SurfaceFlinger unresponsive (%s [%d]) - exit", strerror(-err), err); - return TIMED_OUT; - } - outLayers->clear(); - mCurrentState.traverseInZOrder([&](Layer* layer) { - outLayers->push_back(layer->getLayerDebugInfo()); - }); + postMessageSync(new LambdaMessage([&]() { + mDrawingState.traverseInZOrder([&](Layer* layer) { + outLayers->push_back(layer->getLayerDebugInfo()); + }); - mStateLock.unlock(); + })); return NO_ERROR; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 52655944de..03c3d957fd 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -432,7 +432,7 @@ private: HdrCapabilities* outCapabilities) const override; status_t enableVSyncInjections(bool enable) override; status_t injectVSync(nsecs_t when) override; - status_t getLayerDebugInfo(std::vector* outLayers) const override; + status_t getLayerDebugInfo(std::vector* outLayers) override; status_t getColorManagement(bool* outGetColorManagement) const override; status_t getCompositionPreference(ui::Dataspace* outDataspace, ui::PixelFormat* outPixelFormat, ui::Dataspace* outWideColorGamutDataspace, -- cgit v1.2.3-59-g8ed1b