diff options
-rw-r--r-- | cmds/dumpstate/tests/dumpstate_smoke_test.cpp | 8 | ||||
-rw-r--r-- | cmds/installd/dexopt.cpp | 4 | ||||
-rw-r--r-- | cmds/installd/utils.cpp | 2 | ||||
-rw-r--r-- | cmds/service/service.cpp | 1 | ||||
-rw-r--r-- | libs/binder/RpcState.cpp | 15 | ||||
-rw-r--r-- | libs/binder/RpcState.h | 5 | ||||
-rw-r--r-- | libs/binder/RpcTransportRaw.cpp | 14 | ||||
-rw-r--r-- | libs/binder/RpcTransportTls.cpp | 16 | ||||
-rw-r--r-- | libs/binder/include/binder/RpcTransport.h | 4 | ||||
-rw-r--r-- | libs/binder/rust/Android.bp | 3 | ||||
-rw-r--r-- | libs/binder/tests/rpc_fuzzer/corpus/transact_on_binder | bin | 0 -> 140 bytes | |||
-rw-r--r-- | libs/cputimeinstate/Android.bp | 1 | ||||
-rw-r--r-- | libs/cputimeinstate/TEST_MAPPING | 7 | ||||
-rw-r--r-- | libs/cputimeinstate/testtimeinstate.cpp | 58 | ||||
-rw-r--r-- | libs/nativedisplay/surfacetexture/EGLConsumer.cpp | 4 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 1 |
16 files changed, 88 insertions, 55 deletions
diff --git a/cmds/dumpstate/tests/dumpstate_smoke_test.cpp b/cmds/dumpstate/tests/dumpstate_smoke_test.cpp index 0712c0adcd..28e5ee2ca9 100644 --- a/cmds/dumpstate/tests/dumpstate_smoke_test.cpp +++ b/cmds/dumpstate/tests/dumpstate_smoke_test.cpp @@ -240,11 +240,11 @@ TEST_F(ZippedBugreportGenerationTest, Is1MBMBinSize) { EXPECT_GE(st.st_size, 1000000 /* 1MB */); } -TEST_F(ZippedBugreportGenerationTest, TakesBetween30And300Seconds) { - EXPECT_GE(duration, 30s) << "Expected completion in more than 30s. Actual time " - << duration.count() << " s."; +TEST_F(ZippedBugreportGenerationTest, TakesBetween20And300Seconds) { + EXPECT_GE(duration, 20s) << "Expected completion in more than 20s. Actual time " + << duration.count() << " ms."; EXPECT_LE(duration, 300s) << "Expected completion in less than 300s. Actual time " - << duration.count() << " s."; + << duration.count() << " ms."; } /** diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index b6f42ad172..c796da6c46 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -244,7 +244,7 @@ bool clear_primary_reference_profile(const std::string& package_name, // The location is the profile name for primary apks or the dex path for secondary dex files. bool clear_primary_current_profiles(const std::string& package_name, const std::string& location) { bool success = true; - // For secondary dex files, we don't really need the user but we use it for sanity checks. + // For secondary dex files, we don't really need the user but we use it for validity checks. std::vector<userid_t> users = get_known_users(/*volume_uuid*/ nullptr); for (auto user : users) { success &= clear_current_profile(package_name, location, user, /*is_secondary_dex*/false); @@ -468,7 +468,7 @@ static void open_profile_files(uid_t uid, const std::string& package_name, *reference_profile_fd = open_reference_profile(uid, package_name, location, /*read_write*/ true, is_secondary_dex); - // For secondary dex files, we don't really need the user but we use it for sanity checks. + // For secondary dex files, we don't really need the user but we use it for validity checks. // Note: the user owning the dex file should be the current user. std::vector<userid_t> users; if (is_secondary_dex){ diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp index c4ecd070c1..0f8a732345 100644 --- a/cmds/installd/utils.cpp +++ b/cmds/installd/utils.cpp @@ -829,7 +829,7 @@ void remove_path_xattr(const std::string& path, const char* inode_xattr) { * to top level directories (i.e. have ".."). */ static int validate_path(const std::string& dir, const std::string& path, int maxSubdirs) { - // Argument sanity checking + // Argument check if (dir.find('/') != 0 || dir.rfind('/') != dir.size() - 1 || dir.find("..") != std::string::npos) { LOG(ERROR) << "Invalid directory " << dir; diff --git a/cmds/service/service.cpp b/cmds/service/service.cpp index fe417a362f..d5ca725eb9 100644 --- a/cmds/service/service.cpp +++ b/cmds/service/service.cpp @@ -21,6 +21,7 @@ #include <cutils/ashmem.h> #include <getopt.h> +#include <libgen.h> #include <stdlib.h> #include <stdio.h> #include <string.h> diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index 6286c9c7bc..4ddbce71a8 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -310,9 +310,9 @@ RpcState::CommandData::CommandData(size_t size) : mSize(size) { } status_t RpcState::rpcSend(const sp<RpcSession::RpcConnection>& connection, - const sp<RpcSession>& session, const char* what, iovec* iovs, - size_t niovs, const std::function<status_t()>& altPoll) { - for (size_t i = 0; i < niovs; i++) { + const sp<RpcSession>& session, const char* what, iovec* iovs, int niovs, + const std::function<status_t()>& altPoll) { + for (int i = 0; i < niovs; i++) { LOG_RPC_DETAIL("Sending %s on RpcTransport %p: %s", what, connection->rpcTransport.get(), android::base::HexString(iovs[i].iov_base, iovs[i].iov_len).c_str()); } @@ -321,7 +321,7 @@ status_t RpcState::rpcSend(const sp<RpcSession::RpcConnection>& connection, connection->rpcTransport->interruptableWriteFully(session->mShutdownTrigger.get(), iovs, niovs, altPoll); status != OK) { - LOG_RPC_DETAIL("Failed to write %s (%zu iovs) on RpcTransport %p, error: %s", what, niovs, + LOG_RPC_DETAIL("Failed to write %s (%d iovs) on RpcTransport %p, error: %s", what, niovs, connection->rpcTransport.get(), statusToString(status).c_str()); (void)session->shutdownAndWait(false); return status; @@ -331,19 +331,18 @@ status_t RpcState::rpcSend(const sp<RpcSession::RpcConnection>& connection, } status_t RpcState::rpcRec(const sp<RpcSession::RpcConnection>& connection, - const sp<RpcSession>& session, const char* what, iovec* iovs, - size_t niovs) { + const sp<RpcSession>& session, const char* what, iovec* iovs, int niovs) { if (status_t status = connection->rpcTransport->interruptableReadFully(session->mShutdownTrigger.get(), iovs, niovs, {}); status != OK) { - LOG_RPC_DETAIL("Failed to read %s (%zu iovs) on RpcTransport %p, error: %s", what, niovs, + LOG_RPC_DETAIL("Failed to read %s (%d iovs) on RpcTransport %p, error: %s", what, niovs, connection->rpcTransport.get(), statusToString(status).c_str()); (void)session->shutdownAndWait(false); return status; } - for (size_t i = 0; i < niovs; i++) { + for (int i = 0; i < niovs; i++) { LOG_RPC_DETAIL("Received %s on RpcTransport %p: %s", what, connection->rpcTransport.get(), android::base::HexString(iovs[i].iov_base, iovs[i].iov_len).c_str()); } diff --git a/libs/binder/RpcState.h b/libs/binder/RpcState.h index 5cad394a2f..f4a08942b3 100644 --- a/libs/binder/RpcState.h +++ b/libs/binder/RpcState.h @@ -180,11 +180,10 @@ private: [[nodiscard]] status_t rpcSend(const sp<RpcSession::RpcConnection>& connection, const sp<RpcSession>& session, const char* what, iovec* iovs, - size_t niovs, - const std::function<status_t()>& altPoll = nullptr); + int niovs, const std::function<status_t()>& altPoll = nullptr); [[nodiscard]] status_t rpcRec(const sp<RpcSession::RpcConnection>& connection, const sp<RpcSession>& session, const char* what, iovec* iovs, - size_t niovs); + int niovs); [[nodiscard]] status_t waitForReply(const sp<RpcSession::RpcConnection>& connection, const sp<RpcSession>& session, Parcel* reply); diff --git a/libs/binder/RpcTransportRaw.cpp b/libs/binder/RpcTransportRaw.cpp index 2182e1868e..636e5d06e5 100644 --- a/libs/binder/RpcTransportRaw.cpp +++ b/libs/binder/RpcTransportRaw.cpp @@ -44,11 +44,15 @@ public: } template <typename SendOrReceive> - status_t interruptableReadOrWrite(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, + status_t interruptableReadOrWrite(FdTrigger* fdTrigger, iovec* iovs, int niovs, SendOrReceive sendOrReceiveFun, const char* funName, int16_t event, const std::function<status_t()>& altPoll) { MAYBE_WAIT_IN_FLAKE_MODE; + if (niovs < 0) { + return BAD_VALUE; + } + // Since we didn't poll, we need to manually check to see if it was triggered. Otherwise, we // may never know we should be shutting down. if (fdTrigger->isTriggered()) { @@ -74,7 +78,9 @@ public: while (true) { msghdr msg{ .msg_iov = iovs, - .msg_iovlen = niovs, + // posix uses int, glibc uses size_t. niovs is a + // non-negative int and can be cast to either. + .msg_iovlen = static_cast<decltype(msg.msg_iovlen)>(niovs), }; ssize_t processSize = TEMP_FAILURE_RETRY(sendOrReceiveFun(mSocket.get(), &msg, MSG_NOSIGNAL)); @@ -128,13 +134,13 @@ public: } } - status_t interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, + status_t interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) override { return interruptableReadOrWrite(fdTrigger, iovs, niovs, sendmsg, "sendmsg", POLLOUT, altPoll); } - status_t interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, + status_t interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) override { return interruptableReadOrWrite(fdTrigger, iovs, niovs, recvmsg, "recvmsg", POLLIN, altPoll); diff --git a/libs/binder/RpcTransportTls.cpp b/libs/binder/RpcTransportTls.cpp index c05ea1512f..3936204bdf 100644 --- a/libs/binder/RpcTransportTls.cpp +++ b/libs/binder/RpcTransportTls.cpp @@ -275,9 +275,9 @@ public: RpcTransportTls(android::base::unique_fd socket, Ssl ssl) : mSocket(std::move(socket)), mSsl(std::move(ssl)) {} Result<size_t> peek(void* buf, size_t size) override; - status_t interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, + status_t interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) override; - status_t interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, + status_t interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) override; private: @@ -303,16 +303,18 @@ Result<size_t> RpcTransportTls::peek(void* buf, size_t size) { return ret; } -status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, +status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) { MAYBE_WAIT_IN_FLAKE_MODE; + if (niovs < 0) return BAD_VALUE; + // Before doing any I/O, check trigger once. This ensures the trigger is checked at least // once. The trigger is also checked via triggerablePoll() after every SSL_write(). if (fdTrigger->isTriggered()) return DEAD_OBJECT; size_t size = 0; - for (size_t i = 0; i < niovs; i++) { + for (int i = 0; i < niovs; i++) { const iovec& iov = iovs[i]; if (iov.iov_len == 0) { continue; @@ -343,16 +345,18 @@ status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, iovec* i return OK; } -status_t RpcTransportTls::interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, size_t niovs, +status_t RpcTransportTls::interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) { MAYBE_WAIT_IN_FLAKE_MODE; + if (niovs < 0) return BAD_VALUE; + // Before doing any I/O, check trigger once. This ensures the trigger is checked at least // once. The trigger is also checked via triggerablePoll() after every SSL_write(). if (fdTrigger->isTriggered()) return DEAD_OBJECT; size_t size = 0; - for (size_t i = 0; i < niovs; i++) { + for (int i = 0; i < niovs; i++) { const iovec& iov = iovs[i]; if (iov.iov_len == 0) { continue; diff --git a/libs/binder/include/binder/RpcTransport.h b/libs/binder/include/binder/RpcTransport.h index 348bfebf15..ade2d94609 100644 --- a/libs/binder/include/binder/RpcTransport.h +++ b/libs/binder/include/binder/RpcTransport.h @@ -58,10 +58,10 @@ public: * error - interrupted (failure or trigger) */ [[nodiscard]] virtual status_t interruptableWriteFully( - FdTrigger *fdTrigger, iovec *iovs, size_t niovs, + FdTrigger *fdTrigger, iovec *iovs, int niovs, const std::function<status_t()> &altPoll) = 0; [[nodiscard]] virtual status_t interruptableReadFully( - FdTrigger *fdTrigger, iovec *iovs, size_t niovs, + FdTrigger *fdTrigger, iovec *iovs, int niovs, const std::function<status_t()> &altPoll) = 0; protected: diff --git a/libs/binder/rust/Android.bp b/libs/binder/rust/Android.bp index 90cbf9d45d..355b3b4b89 100644 --- a/libs/binder/rust/Android.bp +++ b/libs/binder/rust/Android.bp @@ -44,6 +44,7 @@ rust_library { "libtokio", ], host_supported: true, + vendor_available: true, target: { darwin: { enabled: false, @@ -52,8 +53,10 @@ rust_library { apex_available: [ "//apex_available:platform", "com.android.compos", + "com.android.uwb", "com.android.virt", ], + min_sdk_version: "Tiramisu", } rust_library { diff --git a/libs/binder/tests/rpc_fuzzer/corpus/transact_on_binder b/libs/binder/tests/rpc_fuzzer/corpus/transact_on_binder Binary files differnew file mode 100644 index 0000000000..ae081e659f --- /dev/null +++ b/libs/binder/tests/rpc_fuzzer/corpus/transact_on_binder diff --git a/libs/cputimeinstate/Android.bp b/libs/cputimeinstate/Android.bp index 73f9d4d153..4f63194f03 100644 --- a/libs/cputimeinstate/Android.bp +++ b/libs/cputimeinstate/Android.bp @@ -45,4 +45,5 @@ cc_test { "-Wextra", ], require_root: true, + test_suites: ["general-tests"], } diff --git a/libs/cputimeinstate/TEST_MAPPING b/libs/cputimeinstate/TEST_MAPPING new file mode 100644 index 0000000000..4781520755 --- /dev/null +++ b/libs/cputimeinstate/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "libtimeinstate_test" + } + ] +} diff --git a/libs/cputimeinstate/testtimeinstate.cpp b/libs/cputimeinstate/testtimeinstate.cpp index 2112b10ebc..1513ecafc8 100644 --- a/libs/cputimeinstate/testtimeinstate.cpp +++ b/libs/cputimeinstate/testtimeinstate.cpp @@ -27,6 +27,7 @@ #include <gtest/gtest.h> +#include <android-base/properties.h> #include <android-base/unique_fd.h> #include <bpf/BpfMap.h> #include <cputimeinstate.h> @@ -40,24 +41,31 @@ static constexpr uint64_t NSEC_PER_YEAR = NSEC_PER_SEC * 60 * 60 * 24 * 365; using std::vector; -TEST(TimeInStateTest, IsTrackingSupported) { - isTrackingUidTimesSupported(); - SUCCEED(); -} +class TimeInStateTest : public testing::Test { + protected: + TimeInStateTest() {}; + + void SetUp() { + if (!isTrackingUidTimesSupported() || + !android::base::GetBoolProperty("sys.init.perf_lsm_hooks", false)) { + GTEST_SKIP(); + } + } +}; -TEST(TimeInStateTest, TotalTimeInState) { +TEST_F(TimeInStateTest, TotalTimeInState) { auto times = getTotalCpuFreqTimes(); ASSERT_TRUE(times.has_value()); EXPECT_FALSE(times->empty()); } -TEST(TimeInStateTest, SingleUidTimeInState) { +TEST_F(TimeInStateTest, SingleUidTimeInState) { auto times = getUidCpuFreqTimes(0); ASSERT_TRUE(times.has_value()); EXPECT_FALSE(times->empty()); } -TEST(TimeInStateTest, SingleUidConcurrentTimes) { +TEST_F(TimeInStateTest, SingleUidConcurrentTimes) { auto concurrentTimes = getUidConcurrentTimes(0); ASSERT_TRUE(concurrentTimes.has_value()); ASSERT_FALSE(concurrentTimes->active.empty()); @@ -117,7 +125,7 @@ static void TestUidTimesConsistent(const std::vector<std::vector<uint64_t>> &tim EXPECT_EQ(activeSum, policySum); } -TEST(TimeInStateTest, SingleUidTimesConsistent) { +TEST_F(TimeInStateTest, SingleUidTimesConsistent) { auto times = getUidCpuFreqTimes(0); ASSERT_TRUE(times.has_value()); @@ -127,7 +135,7 @@ TEST(TimeInStateTest, SingleUidTimesConsistent) { ASSERT_NO_FATAL_FAILURE(TestUidTimesConsistent(*times, *concurrentTimes)); } -TEST(TimeInStateTest, AllUidTimeInState) { +TEST_F(TimeInStateTest, AllUidTimeInState) { uint64_t zero = 0; auto maps = {getUidsCpuFreqTimes(), getUidsUpdatedCpuFreqTimes(&zero)}; for (const auto &map : maps) { @@ -163,7 +171,7 @@ void TestCheckUpdate(const std::vector<std::vector<uint64_t>> &before, ASSERT_LE(sumAfter - sumBefore, NSEC_PER_SEC); } -TEST(TimeInStateTest, AllUidUpdatedTimeInState) { +TEST_F(TimeInStateTest, AllUidUpdatedTimeInState) { uint64_t lastUpdate = 0; auto map1 = getUidsUpdatedCpuFreqTimes(&lastUpdate); ASSERT_TRUE(map1.has_value()); @@ -197,7 +205,7 @@ TEST(TimeInStateTest, AllUidUpdatedTimeInState) { } } -TEST(TimeInStateTest, TotalAndAllUidTimeInStateConsistent) { +TEST_F(TimeInStateTest, TotalAndAllUidTimeInStateConsistent) { auto allUid = getUidsCpuFreqTimes(); auto total = getTotalCpuFreqTimes(); @@ -222,7 +230,7 @@ TEST(TimeInStateTest, TotalAndAllUidTimeInStateConsistent) { } } -TEST(TimeInStateTest, SingleAndAllUidTimeInStateConsistent) { +TEST_F(TimeInStateTest, SingleAndAllUidTimeInStateConsistent) { uint64_t zero = 0; auto maps = {getUidsCpuFreqTimes(), getUidsUpdatedCpuFreqTimes(&zero)}; for (const auto &map : maps) { @@ -246,7 +254,7 @@ TEST(TimeInStateTest, SingleAndAllUidTimeInStateConsistent) { } } -TEST(TimeInStateTest, AllUidConcurrentTimes) { +TEST_F(TimeInStateTest, AllUidConcurrentTimes) { uint64_t zero = 0; auto maps = {getUidsConcurrentTimes(), getUidsUpdatedConcurrentTimes(&zero)}; for (const auto &map : maps) { @@ -264,7 +272,7 @@ TEST(TimeInStateTest, AllUidConcurrentTimes) { } } -TEST(TimeInStateTest, AllUidUpdatedConcurrentTimes) { +TEST_F(TimeInStateTest, AllUidUpdatedConcurrentTimes) { uint64_t lastUpdate = 0; auto map1 = getUidsUpdatedConcurrentTimes(&lastUpdate); ASSERT_TRUE(map1.has_value()); @@ -299,7 +307,7 @@ TEST(TimeInStateTest, AllUidUpdatedConcurrentTimes) { } } -TEST(TimeInStateTest, SingleAndAllUidConcurrentTimesConsistent) { +TEST_F(TimeInStateTest, SingleAndAllUidConcurrentTimesConsistent) { uint64_t zero = 0; auto maps = {getUidsConcurrentTimes(), getUidsUpdatedConcurrentTimes(&zero)}; for (const auto &map : maps) { @@ -328,7 +336,7 @@ void TestCheckDelta(uint64_t before, uint64_t after) { ASSERT_LE(after - before, NSEC_PER_SEC * 2 * get_nprocs_conf()); } -TEST(TimeInStateTest, TotalTimeInStateMonotonic) { +TEST_F(TimeInStateTest, TotalTimeInStateMonotonic) { auto before = getTotalCpuFreqTimes(); ASSERT_TRUE(before.has_value()); sleep(1); @@ -344,7 +352,7 @@ TEST(TimeInStateTest, TotalTimeInStateMonotonic) { } } -TEST(TimeInStateTest, AllUidTimeInStateMonotonic) { +TEST_F(TimeInStateTest, AllUidTimeInStateMonotonic) { auto map1 = getUidsCpuFreqTimes(); ASSERT_TRUE(map1.has_value()); sleep(1); @@ -365,7 +373,7 @@ TEST(TimeInStateTest, AllUidTimeInStateMonotonic) { } } -TEST(TimeInStateTest, AllUidConcurrentTimesMonotonic) { +TEST_F(TimeInStateTest, AllUidConcurrentTimesMonotonic) { auto map1 = getUidsConcurrentTimes(); ASSERT_TRUE(map1.has_value()); ASSERT_FALSE(map1->empty()); @@ -393,7 +401,7 @@ TEST(TimeInStateTest, AllUidConcurrentTimesMonotonic) { } } -TEST(TimeInStateTest, AllUidTimeInStateSanityCheck) { +TEST_F(TimeInStateTest, AllUidTimeInStateSanityCheck) { uint64_t zero = 0; auto maps = {getUidsCpuFreqTimes(), getUidsUpdatedCpuFreqTimes(&zero)}; for (const auto &map : maps) { @@ -414,7 +422,7 @@ TEST(TimeInStateTest, AllUidTimeInStateSanityCheck) { } } -TEST(TimeInStateTest, AllUidConcurrentTimesSanityCheck) { +TEST_F(TimeInStateTest, AllUidConcurrentTimesSanityCheck) { uint64_t zero = 0; auto maps = {getUidsConcurrentTimes(), getUidsUpdatedConcurrentTimes(&zero)}; for (const auto &concurrentMap : maps) { @@ -441,7 +449,7 @@ TEST(TimeInStateTest, AllUidConcurrentTimesSanityCheck) { } } -TEST(TimeInStateTest, AllUidConcurrentTimesFailsOnInvalidBucket) { +TEST_F(TimeInStateTest, AllUidConcurrentTimesFailsOnInvalidBucket) { uint32_t uid = 0; { // Find an unused UID @@ -463,7 +471,7 @@ TEST(TimeInStateTest, AllUidConcurrentTimesFailsOnInvalidBucket) { ASSERT_FALSE(deleteMapEntry(fd, &key)); } -TEST(TimeInStateTest, AllUidTimesConsistent) { +TEST_F(TimeInStateTest, AllUidTimesConsistent) { auto tisMap = getUidsCpuFreqTimes(); ASSERT_TRUE(tisMap.has_value()); @@ -481,7 +489,7 @@ TEST(TimeInStateTest, AllUidTimesConsistent) { } } -TEST(TimeInStateTest, RemoveUid) { +TEST_F(TimeInStateTest, RemoveUid) { uint32_t uid = 0; { // Find an unused UID @@ -547,7 +555,7 @@ TEST(TimeInStateTest, RemoveUid) { ASSERT_EQ(allConcurrentTimes->find(uid), allConcurrentTimes->end()); } -TEST(TimeInStateTest, GetCpuFreqs) { +TEST_F(TimeInStateTest, GetCpuFreqs) { auto freqs = getCpuFreqs(); ASSERT_TRUE(freqs.has_value()); @@ -583,7 +591,7 @@ void *testThread(void *) { return nullptr; } -TEST(TimeInStateTest, GetAggregatedTaskCpuFreqTimes) { +TEST_F(TimeInStateTest, GetAggregatedTaskCpuFreqTimes) { uint64_t startTimeNs = timeNanos(); sem_init(&pingsem, 0, 1); diff --git a/libs/nativedisplay/surfacetexture/EGLConsumer.cpp b/libs/nativedisplay/surfacetexture/EGLConsumer.cpp index 6882ea3090..0128859ca6 100644 --- a/libs/nativedisplay/surfacetexture/EGLConsumer.cpp +++ b/libs/nativedisplay/surfacetexture/EGLConsumer.cpp @@ -593,6 +593,10 @@ status_t EGLConsumer::doGLFenceWaitLocked(SurfaceTexture& st) const { } void EGLConsumer::onFreeBufferLocked(int slotIndex) { + if (mEglSlots[slotIndex].mEglImage != nullptr && + mEglSlots[slotIndex].mEglImage == mCurrentTextureImage) { + mCurrentTextureImage.clear(); + } mEglSlots[slotIndex].mEglImage.clear(); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index fabb3fea5d..893dc2a5d2 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2410,6 +2410,7 @@ void SurfaceFlinger::postComposition() { mTimeStats->recordDisplayEventConnectionCount(sfConnections + appConnections); if (isDisplayConnected && !display->isPoweredOn()) { + getRenderEngine().cleanupPostRender(); return; } |