Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe91787b authored by Pascal Mütschard's avatar Pascal Mütschard
Browse files

Fix JankTracker multimap lookups.

Fixes the layer-to-listeners multimap lookups in the jank tracker to
ensure it gets the right listeners by using the equal_range lookup.

Bug: b/392849939
Test: manual, libsurfaceflinger_unittest, SysUI perf tests
Flag: EXEMPT bugfix
Change-Id: Iff96da68d278e6c0ac8be86a4410a8dcd0abdad0
parent 6e58730a
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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--;
+30 −1
Original line number Diff line number Diff line
@@ -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