Loading services/surfaceflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -245,6 +245,7 @@ cc_defaults { ], static_libs: [ "android.frameworks.displayservice@1.0", "libc++fs", "libdisplayservicehidl", "libserviceutils", ], Loading services/surfaceflinger/SurfaceFlinger.cpp +15 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ #include <cinttypes> #include <cmath> #include <cstdint> #include <filesystem> #include <functional> #include <memory> #include <mutex> Loading Loading @@ -309,6 +310,19 @@ uint32_t getLayerIdFromSurfaceControl(sp<SurfaceControl> surfaceControl) { return LayerHandle::getLayerId(surfaceControl->getHandle()); } /** * Returns true if the file at path exists and is newer than duration. */ bool fileNewerThan(const std::string& path, std::chrono::minutes duration) { using Clock = std::filesystem::file_time_type::clock; std::error_code error; std::filesystem::file_time_type updateTime = std::filesystem::last_write_time(path, error); if (error) { return false; } return duration > (Clock::now() - updateTime); } } // namespace anonymous // --------------------------------------------------------------------------- Loading Loading @@ -899,7 +913,7 @@ void SurfaceFlinger::initTransactionTraceWriter() { TransactionTraceWriter::getInstance().setWriterFunction( [&](const std::string& filename, bool overwrite) { auto writeFn = [&]() { if (!overwrite && access(filename.c_str(), F_OK) == 0) { if (!overwrite && fileNewerThan(filename, std::chrono::minutes{10})) { ALOGD("TransactionTraceWriter: file=%s already exists", filename.c_str()); return; } Loading services/surfaceflinger/fuzzer/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ cc_defaults { ], static_libs: [ "android.hardware.graphics.composer@2.1-resources", "libc++fs", "libgmock", "libgui_mocks", "libgmock_ndk", Loading services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp +30 −1 Original line number Diff line number Diff line Loading @@ -45,12 +45,21 @@ protected: TestableSurfaceFlinger mFlinger; }; TEST_F(TransactionTraceWriterTest, canWriteToFile) { // Check that a new file is written if overwrite=true and no file exists. TEST_F(TransactionTraceWriterTest, canWriteToFile_overwriteTrue) { TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ true); EXPECT_EQ(access(mFilename.c_str(), F_OK), 0); verifyTraceFile(); } // Check that a new file is written if overwrite=false and no file exists. TEST_F(TransactionTraceWriterTest, canWriteToFile_overwriteFalse) { TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ false); EXPECT_EQ(access(mFilename.c_str(), F_OK), 0); verifyTraceFile(); } // Check that an existing file is overwritten when overwrite=true. TEST_F(TransactionTraceWriterTest, canOverwriteFile) { std::string testLine = "test"; { Loading @@ -61,6 +70,7 @@ TEST_F(TransactionTraceWriterTest, canOverwriteFile) { verifyTraceFile(); } // Check that an existing file isn't overwritten when it is new and overwrite=false. TEST_F(TransactionTraceWriterTest, doNotOverwriteFile) { std::string testLine = "test"; { Loading @@ -76,4 +86,23 @@ TEST_F(TransactionTraceWriterTest, doNotOverwriteFile) { EXPECT_EQ(line, testLine); } } // Check that an existing file is overwritten when it is old and overwrite=false. TEST_F(TransactionTraceWriterTest, overwriteOldFile) { std::string testLine = "test"; { std::ofstream file(mFilename, std::ios::out); file << testLine; } // Update file modification time to 15 minutes ago. using Clock = std::filesystem::file_time_type::clock; std::error_code error; std::filesystem::last_write_time(mFilename, Clock::now() - std::chrono::minutes{15}, error); ASSERT_EQ(error.value(), 0); TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ false); verifyTraceFile(); } } // namespace android No newline at end of file Loading
services/surfaceflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -245,6 +245,7 @@ cc_defaults { ], static_libs: [ "android.frameworks.displayservice@1.0", "libc++fs", "libdisplayservicehidl", "libserviceutils", ], Loading
services/surfaceflinger/SurfaceFlinger.cpp +15 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ #include <cinttypes> #include <cmath> #include <cstdint> #include <filesystem> #include <functional> #include <memory> #include <mutex> Loading Loading @@ -309,6 +310,19 @@ uint32_t getLayerIdFromSurfaceControl(sp<SurfaceControl> surfaceControl) { return LayerHandle::getLayerId(surfaceControl->getHandle()); } /** * Returns true if the file at path exists and is newer than duration. */ bool fileNewerThan(const std::string& path, std::chrono::minutes duration) { using Clock = std::filesystem::file_time_type::clock; std::error_code error; std::filesystem::file_time_type updateTime = std::filesystem::last_write_time(path, error); if (error) { return false; } return duration > (Clock::now() - updateTime); } } // namespace anonymous // --------------------------------------------------------------------------- Loading Loading @@ -899,7 +913,7 @@ void SurfaceFlinger::initTransactionTraceWriter() { TransactionTraceWriter::getInstance().setWriterFunction( [&](const std::string& filename, bool overwrite) { auto writeFn = [&]() { if (!overwrite && access(filename.c_str(), F_OK) == 0) { if (!overwrite && fileNewerThan(filename, std::chrono::minutes{10})) { ALOGD("TransactionTraceWriter: file=%s already exists", filename.c_str()); return; } Loading
services/surfaceflinger/fuzzer/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ cc_defaults { ], static_libs: [ "android.hardware.graphics.composer@2.1-resources", "libc++fs", "libgmock", "libgui_mocks", "libgmock_ndk", Loading
services/surfaceflinger/tests/unittests/TransactionTraceWriterTest.cpp +30 −1 Original line number Diff line number Diff line Loading @@ -45,12 +45,21 @@ protected: TestableSurfaceFlinger mFlinger; }; TEST_F(TransactionTraceWriterTest, canWriteToFile) { // Check that a new file is written if overwrite=true and no file exists. TEST_F(TransactionTraceWriterTest, canWriteToFile_overwriteTrue) { TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ true); EXPECT_EQ(access(mFilename.c_str(), F_OK), 0); verifyTraceFile(); } // Check that a new file is written if overwrite=false and no file exists. TEST_F(TransactionTraceWriterTest, canWriteToFile_overwriteFalse) { TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ false); EXPECT_EQ(access(mFilename.c_str(), F_OK), 0); verifyTraceFile(); } // Check that an existing file is overwritten when overwrite=true. TEST_F(TransactionTraceWriterTest, canOverwriteFile) { std::string testLine = "test"; { Loading @@ -61,6 +70,7 @@ TEST_F(TransactionTraceWriterTest, canOverwriteFile) { verifyTraceFile(); } // Check that an existing file isn't overwritten when it is new and overwrite=false. TEST_F(TransactionTraceWriterTest, doNotOverwriteFile) { std::string testLine = "test"; { Loading @@ -76,4 +86,23 @@ TEST_F(TransactionTraceWriterTest, doNotOverwriteFile) { EXPECT_EQ(line, testLine); } } // Check that an existing file is overwritten when it is old and overwrite=false. TEST_F(TransactionTraceWriterTest, overwriteOldFile) { std::string testLine = "test"; { std::ofstream file(mFilename, std::ios::out); file << testLine; } // Update file modification time to 15 minutes ago. using Clock = std::filesystem::file_time_type::clock; std::error_code error; std::filesystem::last_write_time(mFilename, Clock::now() - std::chrono::minutes{15}, error); ASSERT_EQ(error.value(), 0); TransactionTraceWriter::getInstance().invokeForTest(mFilename, /* overwrite */ false); verifyTraceFile(); } } // namespace android No newline at end of file