diff options
3 files changed, 39 insertions, 2 deletions
diff --git a/services/surfaceflinger/Tracing/TransactionTracing.h b/services/surfaceflinger/Tracing/TransactionTracing.h index ddbf3e4873..6a66fff75f 100644 --- a/services/surfaceflinger/Tracing/TransactionTracing.h +++ b/services/surfaceflinger/Tracing/TransactionTracing.h @@ -218,6 +218,13 @@ class TransactionTraceWriter : public Singleton<TransactionTraceWriter> { friend class Singleton<TransactionTracing>; std::function<void(const std::string& prefix, bool overwrite)> mWriterFunction = [](const std::string&, bool) {}; + std::atomic<bool> mEnabled{true}; + + void doInvoke(const std::string& filename, bool overwrite) { + if (mEnabled) { + mWriterFunction(filename, overwrite); + } + }; public: void setWriterFunction( @@ -225,12 +232,15 @@ public: mWriterFunction = std::move(function); } void invoke(const std::string& prefix, bool overwrite) { - mWriterFunction(TransactionTracing::getFilePath(prefix), overwrite); + doInvoke(TransactionTracing::getFilePath(prefix), overwrite); } /* pass in a complete file path for testing */ void invokeForTest(const std::string& filename, bool overwrite) { - mWriterFunction(filename, overwrite); + doInvoke(filename, overwrite); } + /* hacky way to avoid generating traces when converting transaction trace to layers trace. */ + void disable() { mEnabled.store(false); } + void enable() { mEnabled.store(true); } }; } // namespace android diff --git a/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp b/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp index 3f46e6c7e8..617ea2c566 100644 --- a/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp +++ b/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp @@ -40,9 +40,24 @@ namespace android { using namespace ftl::flag_operators; +namespace { +class ScopedTraceDisabler { +public: + ScopedTraceDisabler() { TransactionTraceWriter::getInstance().disable(); } + ~ScopedTraceDisabler() { TransactionTraceWriter::getInstance().enable(); } +}; +} // namespace + bool LayerTraceGenerator::generate(const perfetto::protos::TransactionTraceFile& traceFile, std::uint32_t traceFlags, LayerTracing& layerTracing, bool onlyLastEntry) { + // We are generating the layers trace by replaying back a set of transactions. If the + // transactions have unexpected states, we may generate a transaction trace to debug + // the unexpected state. This is silly. So we disable it by poking the + // TransactionTraceWriter. This is really a hack since we should manage our depenecies a + // little better. + ScopedTraceDisabler fatalErrorTraceDisabler; + if (traceFile.entry_size() == 0) { ALOGD("Trace file is empty"); return false; diff --git a/services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp b/services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp index 4a83d445fc..d071ce985f 100644 --- a/services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp +++ b/services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp @@ -105,4 +105,16 @@ TEST_F(TransactionTraceWriterTest, overwriteOldFile) { verifyTraceFile(); } +// Check we cannot write to file if the trace write is disabled. +TEST_F(TransactionTraceWriterTest, canDisableTraceWriter) { + TransactionTraceWriter::getInstance().disable(); + TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ true); + EXPECT_NE(access(mFilename.c_str(), F_OK), 0); + + TransactionTraceWriter::getInstance().enable(); + TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ true); + EXPECT_EQ(access(mFilename.c_str(), F_OK), 0); + verifyTraceFile(); +} + } // namespace android
\ No newline at end of file |