Loading services/surfaceflinger/Tracing/TransactionTracing.h +12 −2 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/surfaceflinger/Tracing/TransactionTracing.h +12 −2 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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
services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -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