Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b123f47b authored by Vishnu Nair's avatar Vishnu Nair
Browse files

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
parent a03e1302
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -610,7 +610,7 @@ public:
        return result;
    }

    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const
    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers)
    {
        if (!outLayers) {
            return UNEXPECTED_NULL;
+1 −1
Original line number Diff line number Diff line
@@ -307,7 +307,7 @@ public:
     *
     * Requires the ACCESS_SURFACE_FLINGER permission.
     */
    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const = 0;
    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) = 0;

    virtual status_t getColorManagement(bool* outGetColorManagement) const = 0;

+1 −1
Original line number Diff line number Diff line
@@ -648,7 +648,7 @@ public:
        return NO_ERROR;
    }
    status_t injectVSync(nsecs_t /*when*/) override { return NO_ERROR; }
    status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* /*layers*/) const override {
    status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* /*layers*/) override {
        return NO_ERROR;
    }
    status_t getCompositionPreference(
+1 −1
Original line number Diff line number Diff line
@@ -1280,7 +1280,7 @@ LayerDebugInfo Layer::getLayerDebugInfo() const {
    LayerDebugInfo info;
    const State& ds = getDrawingState();
    info.mName = getName();
    sp<Layer> parent = getParent();
    sp<Layer> parent = mDrawingParent.promote();
    info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
    info.mType = std::string(getTypeId());
    info.mTransparentRegion = ds.activeTransparentRegion_legacy;
+6 −13
Original line number Diff line number Diff line
@@ -1284,22 +1284,15 @@ status_t SurfaceFlinger::injectVSync(nsecs_t when) {
    return NO_ERROR;
}

status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const
status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* 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) {
    postMessageSync(new LambdaMessage([&]() { 
            mDrawingState.traverseInZOrder([&](Layer* layer) {
            outLayers->push_back(layer->getLayerDebugInfo());
        });

    mStateLock.unlock();
    }));
    return NO_ERROR;
}

Loading