Loading services/surfaceflinger/Jank/JankTracker.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ void JankTracker::onJankData(int32_t layerId, gui::JankData data) { } void JankTracker::addJankListenerLocked(int32_t layerId, sp<IBinder> listener) { for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second; it++) { if (it->second.mListener == listener) { // Undo the duplicate increment in addJankListener. sListenerCount--; Loading @@ -106,7 +107,8 @@ void JankTracker::doFlushJankData(int32_t layerId) { std::vector<sp<IBinder>> toSend; mLock.lock(); for (auto it = mJankListeners.find(layerId); it != mJankListeners.end();) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second;) { if (!jankData.empty()) { toSend.emplace_back(it->second.mListener); } Loading @@ -133,7 +135,8 @@ void JankTracker::doFlushJankData(int32_t layerId) { void JankTracker::markJankListenerForRemovalLocked(int32_t layerId, sp<IBinder> listener, int64_t afterVysnc) { for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second; it++) { if (it->second.mListener == listener) { it->second.mRemoveAfter = std::max(static_cast<int64_t>(0), afterVysnc); return; Loading @@ -156,7 +159,8 @@ int64_t JankTracker::transferAvailableJankData(int32_t layerId, void JankTracker::dropJankListener(int32_t layerId, sp<IBinder> listener) { const std::lock_guard<std::mutex> _l(mLock); for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second; it++) { if (it->second.mListener == listener) { mJankListeners.erase(it); sListenerCount--; Loading services/surfaceflinger/tests/unittests/JankTrackerTest.cpp +30 −1 Original line number Diff line number Diff line Loading @@ -213,4 +213,33 @@ TEST_F(JankTrackerTest, listenerCountIsAccurateOnDuplicateRegistration) { EXPECT_EQ(listenerCount(), 0u); } TEST_F(JankTrackerTest, multipleLayersAreTrackedIndependently) { size_t jankDataReceived = 0; size_t numBatchesReceived = 0; EXPECT_CALL(*mListener.get(), onJankData(_)) .WillRepeatedly([&](const std::vector<gui::JankData>& jankData) { jankDataReceived += jankData.size(); numBatchesReceived++; return binder::Status::ok(); }); addJankListener(123); addJankListener(321); addJankData(123, 1); addJankData(123, 2); addJankData(123, 3); addJankData(321, 4); addJankData(321, 5); JankTracker::flushJankData(123); flushBackgroundThread(); EXPECT_EQ(numBatchesReceived, 1u); EXPECT_EQ(jankDataReceived, 3u); JankTracker::flushJankData(321); flushBackgroundThread(); EXPECT_EQ(numBatchesReceived, 2u); EXPECT_EQ(jankDataReceived, 5u); } } // namespace android Loading
services/surfaceflinger/Jank/JankTracker.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ void JankTracker::onJankData(int32_t layerId, gui::JankData data) { } void JankTracker::addJankListenerLocked(int32_t layerId, sp<IBinder> listener) { for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second; it++) { if (it->second.mListener == listener) { // Undo the duplicate increment in addJankListener. sListenerCount--; Loading @@ -106,7 +107,8 @@ void JankTracker::doFlushJankData(int32_t layerId) { std::vector<sp<IBinder>> toSend; mLock.lock(); for (auto it = mJankListeners.find(layerId); it != mJankListeners.end();) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second;) { if (!jankData.empty()) { toSend.emplace_back(it->second.mListener); } Loading @@ -133,7 +135,8 @@ void JankTracker::doFlushJankData(int32_t layerId) { void JankTracker::markJankListenerForRemovalLocked(int32_t layerId, sp<IBinder> listener, int64_t afterVysnc) { for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second; it++) { if (it->second.mListener == listener) { it->second.mRemoveAfter = std::max(static_cast<int64_t>(0), afterVysnc); return; Loading @@ -156,7 +159,8 @@ int64_t JankTracker::transferAvailableJankData(int32_t layerId, void JankTracker::dropJankListener(int32_t layerId, sp<IBinder> listener) { const std::lock_guard<std::mutex> _l(mLock); for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) { auto range = mJankListeners.equal_range(layerId); for (auto it = range.first; it != range.second; it++) { if (it->second.mListener == listener) { mJankListeners.erase(it); sListenerCount--; Loading
services/surfaceflinger/tests/unittests/JankTrackerTest.cpp +30 −1 Original line number Diff line number Diff line Loading @@ -213,4 +213,33 @@ TEST_F(JankTrackerTest, listenerCountIsAccurateOnDuplicateRegistration) { EXPECT_EQ(listenerCount(), 0u); } TEST_F(JankTrackerTest, multipleLayersAreTrackedIndependently) { size_t jankDataReceived = 0; size_t numBatchesReceived = 0; EXPECT_CALL(*mListener.get(), onJankData(_)) .WillRepeatedly([&](const std::vector<gui::JankData>& jankData) { jankDataReceived += jankData.size(); numBatchesReceived++; return binder::Status::ok(); }); addJankListener(123); addJankListener(321); addJankData(123, 1); addJankData(123, 2); addJankData(123, 3); addJankData(321, 4); addJankData(321, 5); JankTracker::flushJankData(123); flushBackgroundThread(); EXPECT_EQ(numBatchesReceived, 1u); EXPECT_EQ(jankDataReceived, 3u); JankTracker::flushJankData(321); flushBackgroundThread(); EXPECT_EQ(numBatchesReceived, 2u); EXPECT_EQ(jankDataReceived, 5u); } } // namespace android