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

Commit 0f083b8f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "SF: avoid rearming Timer during cancel" into rvc-dev

parents 98cbb19c b340b734
Loading
Loading
Loading
Loading
+7 −3
Original line number Original line Diff line number Diff line
@@ -338,10 +338,14 @@ CancelResult VSyncDispatchTimerQueue::cancel(CallbackToken token) {
    }
    }
    auto& callback = it->second;
    auto& callback = it->second;


    if (callback->wakeupTime()) {
    auto const wakeupTime = callback->wakeupTime();
    if (wakeupTime) {
        callback->disarm();
        callback->disarm();

        if (*wakeupTime == mIntendedWakeupTime) {
            mIntendedWakeupTime = kInvalidTime;
            mIntendedWakeupTime = kInvalidTime;
            rearmTimer(mTimeKeeper->now());
            rearmTimer(mTimeKeeper->now());
        }
        return CancelResult::Cancelled;
        return CancelResult::Cancelled;
    }
    }
    return CancelResult::TooLate;
    return CancelResult::TooLate;
+46 −0
Original line number Original line Diff line number Diff line
@@ -701,6 +701,52 @@ TEST_F(VSyncDispatchTimerQueueTest, skipsSchedulingIfTimerReschedulingIsImminent
    EXPECT_THAT(cb.mCalls.size(), Eq(1));
    EXPECT_THAT(cb.mCalls.size(), Eq(1));
}
}


// b/154303580.
TEST_F(VSyncDispatchTimerQueueTest, skipsRearmingWhenNotNextScheduled) {
    Sequence seq;
    EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
    EXPECT_CALL(mMockClock, alarmCancel()).InSequence(seq);
    CountingCallback cb1(mDispatch);
    CountingCallback cb2(mDispatch);

    EXPECT_EQ(mDispatch.schedule(cb1, 400, 1000), ScheduleResult::Scheduled);
    EXPECT_EQ(mDispatch.schedule(cb2, 100, 2000), ScheduleResult::Scheduled);

    mMockClock.setLag(100);
    mMockClock.advanceBy(620);

    EXPECT_EQ(mDispatch.cancel(cb2), CancelResult::Cancelled);

    mMockClock.advanceBy(80);

    EXPECT_THAT(cb1.mCalls.size(), Eq(1));
    EXPECT_THAT(cb2.mCalls.size(), Eq(0));
}

TEST_F(VSyncDispatchTimerQueueTest, rearmsWhenCancelledAndIsNextScheduled) {
    Sequence seq;
    EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
    EXPECT_CALL(mMockClock, alarmIn(_, 1280)).InSequence(seq);
    EXPECT_CALL(mMockClock, alarmCancel()).InSequence(seq);
    CountingCallback cb1(mDispatch);
    CountingCallback cb2(mDispatch);

    EXPECT_EQ(mDispatch.schedule(cb1, 400, 1000), ScheduleResult::Scheduled);
    EXPECT_EQ(mDispatch.schedule(cb2, 100, 2000), ScheduleResult::Scheduled);

    mMockClock.setLag(100);
    mMockClock.advanceBy(620);

    EXPECT_EQ(mDispatch.cancel(cb1), CancelResult::Cancelled);

    EXPECT_THAT(cb1.mCalls.size(), Eq(0));
    EXPECT_THAT(cb2.mCalls.size(), Eq(0));
    mMockClock.advanceToNextCallback();

    EXPECT_THAT(cb1.mCalls.size(), Eq(0));
    EXPECT_THAT(cb2.mCalls.size(), Eq(1));
}

class VSyncDispatchTimerQueueEntryTest : public testing::Test {
class VSyncDispatchTimerQueueEntryTest : public testing::Test {
protected:
protected:
    nsecs_t const mPeriod = 1000;
    nsecs_t const mPeriod = 1000;