Loading libs/binder/RecordedTransaction.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -123,8 +123,8 @@ std::optional<RecordedTransaction> RecordedTransaction::fromDetails( static_cast<int32_t>(timestamp.tv_nsec), 0}; t.mData.mInterfaceName = String8(interfaceName); if (interfaceName.size() != t.mData.mInterfaceName.bytes()) { t.mData.mInterfaceName = std::string(String8(interfaceName).string()); if (interfaceName.size() != t.mData.mInterfaceName.size()) { LOG(ERROR) << "Interface Name is not valid. Contains characters that aren't single byte " "utf-8: " << interfaceName; Loading Loading @@ -231,7 +231,8 @@ std::optional<RecordedTransaction> RecordedTransaction::fromFile(const unique_fd break; } case INTERFACE_NAME_CHUNK: { t.mData.mInterfaceName.setTo(reinterpret_cast<char*>(payloadMap), chunk.dataSize); t.mData.mInterfaceName = std::string(reinterpret_cast<char*>(payloadMap), chunk.dataSize); break; } case DATA_PARCEL_CHUNK: { Loading Loading @@ -308,7 +309,7 @@ android::status_t RecordedTransaction::dumpToFile(const unique_fd& fd) const { } if (NO_ERROR != writeChunk(fd, INTERFACE_NAME_CHUNK, mData.mInterfaceName.size() * sizeof(uint8_t), reinterpret_cast<const uint8_t*>(mData.mInterfaceName.string()))) { reinterpret_cast<const uint8_t*>(mData.mInterfaceName.c_str()))) { LOG(INFO) << "Failed to write Interface Name Chunk to fd " << fd.get(); return UNKNOWN_ERROR; } Loading @@ -328,7 +329,7 @@ android::status_t RecordedTransaction::dumpToFile(const unique_fd& fd) const { return NO_ERROR; } const android::String8& RecordedTransaction::getInterfaceName() const { const std::string& RecordedTransaction::getInterfaceName() const { return mData.mInterfaceName; } Loading libs/binder/include/binder/RecordedTransaction.h +2 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ public: [[nodiscard]] status_t dumpToFile(const android::base::unique_fd& fd) const; const String8& getInterfaceName() const; const std::string& getInterfaceName() const; uint32_t getCode() const; uint32_t getFlags() const; int32_t getReturnedStatus() const; Loading Loading @@ -73,7 +73,7 @@ private: struct MovableData { // movable TransactionHeader mHeader; String8 mInterfaceName; std::string mInterfaceName; }; MovableData mData; Parcel mSent; Loading libs/binder/tests/binderLibTest.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -1406,9 +1406,11 @@ TEST_F(BinderLibTest, HangingServices) { ASSERT_TRUE(server != nullptr); int32_t delay = 1000; // ms data.writeInt32(delay); // b/266537959 - must take before taking lock, since countdown is started in the remote // process there. size_t epochMsBefore = epochMillis(); EXPECT_THAT(server->transact(BINDER_LIB_TEST_PROCESS_TEMPORARY_LOCK, data, &reply), NO_ERROR); std::vector<std::thread> ts; size_t epochMsBefore = epochMillis(); for (size_t i = 0; i < kKernelThreads + 1; i++) { ts.push_back(std::thread([&] { Parcel local_reply; Loading libs/binder/tests/binderRecordedTransactionTest.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ TEST(BinderRecordedTransaction, RoundTripEncoding) { auto retrievedTransaction = RecordedTransaction::fromFile(fd); EXPECT_EQ(retrievedTransaction->getInterfaceName(), android::String8(interfaceName)); EXPECT_EQ(retrievedTransaction->getInterfaceName(), android::String8(interfaceName).c_str()); EXPECT_EQ(retrievedTransaction->getCode(), 1); EXPECT_EQ(retrievedTransaction->getFlags(), 42); EXPECT_EQ(retrievedTransaction->getTimestamp().tv_sec, ts.tv_sec); Loading libs/gui/BLASTBufferQueue.cpp +26 −7 Original line number Diff line number Diff line Loading @@ -587,9 +587,23 @@ status_t BLASTBufferQueue::acquireNextBufferLocked( t->setDesiredPresentTime(bufferItem.mTimestamp); } if (!mNextFrameTimelineInfoQueue.empty()) { t->setFrameTimelineInfo(mNextFrameTimelineInfoQueue.front()); mNextFrameTimelineInfoQueue.pop(); // Drop stale frame timeline infos while (!mPendingFrameTimelines.empty() && mPendingFrameTimelines.front().first < bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("dropping stale frameNumber: %" PRIu64 " vsyncId: %" PRId64, mPendingFrameTimelines.front().first, mPendingFrameTimelines.front().second.vsyncId); mPendingFrameTimelines.pop(); } if (!mPendingFrameTimelines.empty() && mPendingFrameTimelines.front().first == bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("Transaction::setFrameTimelineInfo frameNumber: %" PRIu64 " vsyncId: %" PRId64, bufferItem.mFrameNumber, mPendingFrameTimelines.front().second.vsyncId); t->setFrameTimelineInfo(mPendingFrameTimelines.front().second); mPendingFrameTimelines.pop(); } { Loading Loading @@ -653,6 +667,7 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) { { std::unique_lock _lock{mMutex}; BBQ_TRACE(); const bool syncTransactionSet = mTransactionReadyCallback != nullptr; BQA_LOGV("onFrameAvailable-start syncTransactionSet=%s", boolToString(syncTransactionSet)); Loading Loading @@ -847,12 +862,13 @@ public: return mBbq->setFrameRate(frameRate, compatibility, changeFrameRateStrategy); } status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override { status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) override { std::unique_lock _lock{mMutex}; if (mDestroyed) { return DEAD_OBJECT; } return mBbq->setFrameTimelineInfo(frameTimelineInfo); return mBbq->setFrameTimelineInfo(frameNumber, frameTimelineInfo); } void destroy() override { Loading @@ -874,9 +890,12 @@ status_t BLASTBufferQueue::setFrameRate(float frameRate, int8_t compatibility, return t.setFrameRate(mSurfaceControl, frameRate, compatibility, shouldBeSeamless).apply(); } status_t BLASTBufferQueue::setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) { status_t BLASTBufferQueue::setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) { ATRACE_FORMAT("%s(%s) frameNumber: %" PRIu64 " vsyncId: %" PRId64, __func__, mName.c_str(), frameNumber, frameTimelineInfo.vsyncId); std::unique_lock _lock{mMutex}; mNextFrameTimelineInfoQueue.push(frameTimelineInfo); mPendingFrameTimelines.push({frameNumber, frameTimelineInfo}); return OK; } Loading Loading
libs/binder/RecordedTransaction.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -123,8 +123,8 @@ std::optional<RecordedTransaction> RecordedTransaction::fromDetails( static_cast<int32_t>(timestamp.tv_nsec), 0}; t.mData.mInterfaceName = String8(interfaceName); if (interfaceName.size() != t.mData.mInterfaceName.bytes()) { t.mData.mInterfaceName = std::string(String8(interfaceName).string()); if (interfaceName.size() != t.mData.mInterfaceName.size()) { LOG(ERROR) << "Interface Name is not valid. Contains characters that aren't single byte " "utf-8: " << interfaceName; Loading Loading @@ -231,7 +231,8 @@ std::optional<RecordedTransaction> RecordedTransaction::fromFile(const unique_fd break; } case INTERFACE_NAME_CHUNK: { t.mData.mInterfaceName.setTo(reinterpret_cast<char*>(payloadMap), chunk.dataSize); t.mData.mInterfaceName = std::string(reinterpret_cast<char*>(payloadMap), chunk.dataSize); break; } case DATA_PARCEL_CHUNK: { Loading Loading @@ -308,7 +309,7 @@ android::status_t RecordedTransaction::dumpToFile(const unique_fd& fd) const { } if (NO_ERROR != writeChunk(fd, INTERFACE_NAME_CHUNK, mData.mInterfaceName.size() * sizeof(uint8_t), reinterpret_cast<const uint8_t*>(mData.mInterfaceName.string()))) { reinterpret_cast<const uint8_t*>(mData.mInterfaceName.c_str()))) { LOG(INFO) << "Failed to write Interface Name Chunk to fd " << fd.get(); return UNKNOWN_ERROR; } Loading @@ -328,7 +329,7 @@ android::status_t RecordedTransaction::dumpToFile(const unique_fd& fd) const { return NO_ERROR; } const android::String8& RecordedTransaction::getInterfaceName() const { const std::string& RecordedTransaction::getInterfaceName() const { return mData.mInterfaceName; } Loading
libs/binder/include/binder/RecordedTransaction.h +2 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ public: [[nodiscard]] status_t dumpToFile(const android::base::unique_fd& fd) const; const String8& getInterfaceName() const; const std::string& getInterfaceName() const; uint32_t getCode() const; uint32_t getFlags() const; int32_t getReturnedStatus() const; Loading Loading @@ -73,7 +73,7 @@ private: struct MovableData { // movable TransactionHeader mHeader; String8 mInterfaceName; std::string mInterfaceName; }; MovableData mData; Parcel mSent; Loading
libs/binder/tests/binderLibTest.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -1406,9 +1406,11 @@ TEST_F(BinderLibTest, HangingServices) { ASSERT_TRUE(server != nullptr); int32_t delay = 1000; // ms data.writeInt32(delay); // b/266537959 - must take before taking lock, since countdown is started in the remote // process there. size_t epochMsBefore = epochMillis(); EXPECT_THAT(server->transact(BINDER_LIB_TEST_PROCESS_TEMPORARY_LOCK, data, &reply), NO_ERROR); std::vector<std::thread> ts; size_t epochMsBefore = epochMillis(); for (size_t i = 0; i < kKernelThreads + 1; i++) { ts.push_back(std::thread([&] { Parcel local_reply; Loading
libs/binder/tests/binderRecordedTransactionTest.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ TEST(BinderRecordedTransaction, RoundTripEncoding) { auto retrievedTransaction = RecordedTransaction::fromFile(fd); EXPECT_EQ(retrievedTransaction->getInterfaceName(), android::String8(interfaceName)); EXPECT_EQ(retrievedTransaction->getInterfaceName(), android::String8(interfaceName).c_str()); EXPECT_EQ(retrievedTransaction->getCode(), 1); EXPECT_EQ(retrievedTransaction->getFlags(), 42); EXPECT_EQ(retrievedTransaction->getTimestamp().tv_sec, ts.tv_sec); Loading
libs/gui/BLASTBufferQueue.cpp +26 −7 Original line number Diff line number Diff line Loading @@ -587,9 +587,23 @@ status_t BLASTBufferQueue::acquireNextBufferLocked( t->setDesiredPresentTime(bufferItem.mTimestamp); } if (!mNextFrameTimelineInfoQueue.empty()) { t->setFrameTimelineInfo(mNextFrameTimelineInfoQueue.front()); mNextFrameTimelineInfoQueue.pop(); // Drop stale frame timeline infos while (!mPendingFrameTimelines.empty() && mPendingFrameTimelines.front().first < bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("dropping stale frameNumber: %" PRIu64 " vsyncId: %" PRId64, mPendingFrameTimelines.front().first, mPendingFrameTimelines.front().second.vsyncId); mPendingFrameTimelines.pop(); } if (!mPendingFrameTimelines.empty() && mPendingFrameTimelines.front().first == bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("Transaction::setFrameTimelineInfo frameNumber: %" PRIu64 " vsyncId: %" PRId64, bufferItem.mFrameNumber, mPendingFrameTimelines.front().second.vsyncId); t->setFrameTimelineInfo(mPendingFrameTimelines.front().second); mPendingFrameTimelines.pop(); } { Loading Loading @@ -653,6 +667,7 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) { { std::unique_lock _lock{mMutex}; BBQ_TRACE(); const bool syncTransactionSet = mTransactionReadyCallback != nullptr; BQA_LOGV("onFrameAvailable-start syncTransactionSet=%s", boolToString(syncTransactionSet)); Loading Loading @@ -847,12 +862,13 @@ public: return mBbq->setFrameRate(frameRate, compatibility, changeFrameRateStrategy); } status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override { status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) override { std::unique_lock _lock{mMutex}; if (mDestroyed) { return DEAD_OBJECT; } return mBbq->setFrameTimelineInfo(frameTimelineInfo); return mBbq->setFrameTimelineInfo(frameNumber, frameTimelineInfo); } void destroy() override { Loading @@ -874,9 +890,12 @@ status_t BLASTBufferQueue::setFrameRate(float frameRate, int8_t compatibility, return t.setFrameRate(mSurfaceControl, frameRate, compatibility, shouldBeSeamless).apply(); } status_t BLASTBufferQueue::setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) { status_t BLASTBufferQueue::setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) { ATRACE_FORMAT("%s(%s) frameNumber: %" PRIu64 " vsyncId: %" PRId64, __func__, mName.c_str(), frameNumber, frameTimelineInfo.vsyncId); std::unique_lock _lock{mMutex}; mNextFrameTimelineInfoQueue.push(frameTimelineInfo); mPendingFrameTimelines.push({frameNumber, frameTimelineInfo}); return OK; } Loading