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

Commit 56960032 authored by Pascal Mütschard's avatar Pascal Mütschard Committed by Android (Google) Code Review
Browse files

Merge "Fix JankTracker multimap lookups." into main

parents 6a3b8502 fe91787b
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