diff options
| -rw-r--r-- | services/surfaceflinger/Jank/JankTracker.cpp | 12 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/JankTrackerTest.cpp | 31 | 
2 files changed, 38 insertions, 5 deletions
diff --git a/services/surfaceflinger/Jank/JankTracker.cpp b/services/surfaceflinger/Jank/JankTracker.cpp index 8e0e084cd2..5e6267dae4 100644 --- a/services/surfaceflinger/Jank/JankTracker.cpp +++ b/services/surfaceflinger/Jank/JankTracker.cpp @@ -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--; @@ -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);          } @@ -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; @@ -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--; diff --git a/services/surfaceflinger/tests/unittests/JankTrackerTest.cpp b/services/surfaceflinger/tests/unittests/JankTrackerTest.cpp index 2941a14ef9..0f16073b07 100644 --- a/services/surfaceflinger/tests/unittests/JankTrackerTest.cpp +++ b/services/surfaceflinger/tests/unittests/JankTrackerTest.cpp @@ -213,4 +213,33 @@ TEST_F(JankTrackerTest, listenerCountIsAccurateOnDuplicateRegistration) {      EXPECT_EQ(listenerCount(), 0u);  } -} // namespace android
\ No newline at end of file +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  |