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

Commit 29aad4e3 authored by Kean Mariotti's avatar Kean Mariotti
Browse files

Do not create new LayerTracing instance within LayerTraceGenerator

LayerDataSource holds a reference to LayerTracing in order to notify
LayerTracing about perfetto events (OnSetup, OnStart, OnFlush, OnStop).

Having multiple instances of LayerTracing complicates things, as it arises
the question of which instance(s) should be referenced and notified
by LayerDataSource.

This commit eliminates the problem at its root, by avoiding to create
an extra LayerTracing instance within LayerTraceGenerator.

Bug: b/293429094
Test: atest transactiontrace_testsuite && atest SurfaceFlinger_test

Change-Id: Id2cf232d1198f9470b476d9a9d9eb86c21246c61
parent 8c5abc81
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -36,6 +36,10 @@ LayerTracing::LayerTracing() {
    LayerDataSource::Initialize(*this);
}

LayerTracing::LayerTracing(std::ostream& outStream) : LayerTracing() {
    mOutStream = std::ref(outStream);
}

LayerTracing::~LayerTracing() {
    LayerDataSource::UnregisterLayerTracing();
}
@@ -49,10 +53,6 @@ void LayerTracing::setTransactionTracing(TransactionTracing& transactionTracing)
    mTransactionTracing = &transactionTracing;
}

void LayerTracing::setOutputStream(std::ostream& outStream) {
    mOutStream = std::ref(outStream);
}

void LayerTracing::onStart(Mode mode, uint32_t flags) {
    switch (mode) {
        case Mode::MODE_ACTIVE: {
@@ -95,7 +95,7 @@ void LayerTracing::onFlush(Mode mode, uint32_t flags) {
    }

    auto transactionTrace = mTransactionTracing->writeToProto();
    LayerTraceGenerator{}.generate(transactionTrace, flags);
    LayerTraceGenerator{}.generate(transactionTrace, flags, *this);
    ALOGD("Flushed generated tracing");
}

+1 −1
Original line number Diff line number Diff line
@@ -97,11 +97,11 @@ public:
    };

    LayerTracing();
    LayerTracing(std::ostream&);
    ~LayerTracing();
    void setTakeLayersSnapshotProtoFunction(
            const std::function<perfetto::protos::LayersSnapshotProto(uint32_t)>&);
    void setTransactionTracing(TransactionTracing&);
    void setOutputStream(std::ostream&);

    // Start event from perfetto data source
    void onStart(Mode mode, uint32_t flags);
+1 −7
Original line number Diff line number Diff line
@@ -41,8 +41,7 @@ namespace android {
using namespace ftl::flag_operators;

bool LayerTraceGenerator::generate(const perfetto::protos::TransactionTraceFile& traceFile,
                                   std::uint32_t traceFlags,
                                   std::optional<std::reference_wrapper<std::ostream>> outStream,
                                   std::uint32_t traceFlags, LayerTracing& layerTracing,
                                   bool onlyLastEntry) {
    if (traceFile.entry_size() == 0) {
        ALOGD("Trace file is empty");
@@ -51,11 +50,6 @@ bool LayerTraceGenerator::generate(const perfetto::protos::TransactionTraceFile&

    TransactionProtoParser parser(std::make_unique<TransactionProtoParser::FlingerDataMapper>());

    LayerTracing layerTracing;
    if (outStream) {
        layerTracing.setOutputStream(outStream->get());
    }

    // frontend
    frontend::LayerLifecycleManager lifecycleManager;
    frontend::LayerHierarchyBuilder hierarchyBuilder{{}};
+1 −2
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ class LayerTracing;
class LayerTraceGenerator {
public:
    bool generate(const perfetto::protos::TransactionTraceFile&, std::uint32_t traceFlags,
                  std::optional<std::reference_wrapper<std::ostream>> outStream = std::nullopt,
                  bool onlyLastEntry = false);
                  LayerTracing& layerTracing, bool onlyLastEntry = false);
};
} // namespace android
+3 −1
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ int main(int argc, char** argv) {
            (argc == 3) ? argv[2] : "/data/misc/wmtrace/layers_trace.winscope";
    auto outStream = std::ofstream{outputLayersTracePath, std::ios::binary | std::ios::app};

    auto layerTracing = LayerTracing{outStream};

    const bool generateLastEntryOnly =
            argc >= 4 && std::string_view(argv[3]) == "--last-entry-only";

@@ -60,7 +62,7 @@ int main(int argc, char** argv) {
    ALOGD("Generating %s...", outputLayersTracePath);
    std::cout << "Generating " << outputLayersTracePath << "\n";

    if (!LayerTraceGenerator().generate(transactionTraceFile, traceFlags, outStream,
    if (!LayerTraceGenerator().generate(transactionTraceFile, traceFlags, layerTracing,
                                        generateLastEntryOnly)) {
        std::cout << "Error: Failed to generate layers trace " << outputLayersTracePath;
        return -1;
Loading