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

Commit be9476bf authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "[SurfaceFlinger] Resolve deadlock in SurfaceTracing." into rvc-dev am: 9fd126d0

Change-Id: If386b938d55bd8b2b2d79ee2a33988cb61886374
parents f88c49e1 9fd126d0
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -4482,12 +4482,11 @@ void SurfaceFlinger::dumpWideColorInfo(std::string& result) const {
    result.append("\n");
}

LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t traceFlags) const {
    Mutex::Autolock _l(mStateLock);
    const auto device = getDefaultDisplayDeviceLocked();
LayersProto SurfaceFlinger::dumpDrawingStateProto(
        uint32_t traceFlags, const sp<const DisplayDevice>& displayDevice) const {
    LayersProto layersProto;
    for (const sp<Layer>& layer : mDrawingState.layersSortedByZ) {
        layer->writeToProto(layersProto, traceFlags, device);
        layer->writeToProto(layersProto, traceFlags, displayDevice);
    }

    return layersProto;
@@ -4519,7 +4518,10 @@ void SurfaceFlinger::dumpOffscreenLayersProto(LayersProto& layersProto, uint32_t

LayersProto SurfaceFlinger::dumpProtoFromMainThread(uint32_t traceFlags) {
    LayersProto layersProto;
    postMessageSync(new LambdaMessage([&]() { layersProto = dumpDrawingStateProto(traceFlags); }));
    postMessageSync(new LambdaMessage([&]() {
        const auto& displayDevice = getDefaultDisplayDeviceLocked();
        layersProto = dumpDrawingStateProto(traceFlags, displayDevice);
    }));
    return layersProto;
}

+2 −1
Original line number Diff line number Diff line
@@ -923,7 +923,8 @@ private:
    void dumpDisplayIdentificationData(std::string& result) const;
    void dumpRawDisplayIdentificationData(const DumpArgs&, std::string& result) const;
    void dumpWideColorInfo(std::string& result) const;
    LayersProto dumpDrawingStateProto(uint32_t traceFlags = SurfaceTracing::TRACE_ALL) const;
    LayersProto dumpDrawingStateProto(uint32_t traceFlags = SurfaceTracing::TRACE_ALL,
                                      const sp<const DisplayDevice>& displayDevice = nullptr) const;
    void dumpOffscreenLayersProto(LayersProto& layersProto,
                                  uint32_t traceFlags = SurfaceTracing::TRACE_ALL) const;
    // Dumps state from HW Composer
+7 −4
Original line number Diff line number Diff line
@@ -45,19 +45,21 @@ void SurfaceTracing::mainLoop() {
}

void SurfaceTracing::addFirstEntry() {
    const auto displayDevice = mFlinger.getDefaultDisplayDevice();
    LayersTraceProto entry;
    {
        std::scoped_lock lock(mSfLock);
        entry = traceLayersLocked("tracing.enable");
        entry = traceLayersLocked("tracing.enable", displayDevice);
    }
    addTraceToBuffer(entry);
}

LayersTraceProto SurfaceTracing::traceWhenNotified() {
    const auto displayDevice = mFlinger.getDefaultDisplayDevice();
    std::unique_lock<std::mutex> lock(mSfLock);
    mCanStartTrace.wait(lock);
    android::base::ScopedLockAssertion assumeLock(mSfLock);
    LayersTraceProto entry = traceLayersLocked(mWhere);
    LayersTraceProto entry = traceLayersLocked(mWhere, displayDevice);
    lock.unlock();
    return entry;
}
@@ -160,13 +162,14 @@ void SurfaceTracing::setTraceFlags(uint32_t flags) {
    mTraceFlags = flags;
}

LayersTraceProto SurfaceTracing::traceLayersLocked(const char* where) {
LayersTraceProto SurfaceTracing::traceLayersLocked(const char* where,
                                                   const sp<const DisplayDevice>& displayDevice) {
    ATRACE_CALL();

    LayersTraceProto entry;
    entry.set_elapsed_realtime_nanos(elapsedRealtimeNano());
    entry.set_where(where);
    LayersProto layers(mFlinger.dumpDrawingStateProto(mTraceFlags));
    LayersProto layers(mFlinger.dumpDrawingStateProto(mTraceFlags, displayDevice));
    mFlinger.dumpOffscreenLayersProto(layers);
    entry.mutable_layers()->Swap(&layers);

+7 −3
Original line number Diff line number Diff line
@@ -16,17 +16,19 @@

#pragma once

#include <android-base/thread_annotations.h>
#include <layerproto/LayerProtoHeader.h>
#include <utils/Errors.h>
#include <utils/StrongPointer.h>

#include <android-base/thread_annotations.h>
#include <condition_variable>
#include <memory>
#include <mutex>
#include <queue>
#include <thread>

#include "DisplayDevice.h"

using namespace android::surfaceflinger;

namespace android {
@@ -85,13 +87,15 @@ private:
    void mainLoop();
    void addFirstEntry();
    LayersTraceProto traceWhenNotified();
    LayersTraceProto traceLayersLocked(const char* where) REQUIRES(mSfLock);
    LayersTraceProto traceLayersLocked(const char* where,
                                       const sp<const DisplayDevice>& displayDevice)
            REQUIRES(mSfLock);

    // Returns true if trace is enabled.
    bool addTraceToBuffer(LayersTraceProto& entry);
    void writeProtoFileLocked() REQUIRES(mTraceLock);

    const SurfaceFlinger& mFlinger;
    SurfaceFlinger& mFlinger;
    status_t mLastErr = NO_ERROR;
    std::thread mThread;
    std::condition_variable mCanStartTrace;