From 088a127c3117c4b4b40d303a51b99d709062eef2 Mon Sep 17 00:00:00 2001 From: Kevin Tang Date: Tue, 15 Sep 2015 19:02:58 -0700 Subject: timer bug fix when a ticking timer is stopped, currently kernel doesn't get updated with the next immediate timer's interval. As a result, kernel timer will expire sooner (with the stopped timer's interval), and the next timer's client is notified for this expiration. Change-Id: I0d67d1418cb9bfe7f70ae71252901d4c6bb699b3 CRs-Fixed: 909776 --- utils/LocTimer.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'utils/LocTimer.cpp') diff --git a/utils/LocTimer.cpp b/utils/LocTimer.cpp index 2d972c4..1699359 100644 --- a/utils/LocTimer.cpp +++ b/utils/LocTimer.cpp @@ -342,8 +342,12 @@ void LocTimerContainer::remove(LocTimerDelegate& timer) { LocMsg(), mTimerContainer(&container), mTimer(&timer) {} inline virtual void proc() const { LocTimerDelegate* priorTop = mTimerContainer->getSoonestTimer(); - if (NULL != ((LocHeap*)mTimerContainer)->remove((LocRankable&)*mTimer)) { - mTimerContainer->updateSoonestTime(priorTop); + // update soonest timer only if mTimer is actually removed from mTimerContainer + // AND mTimer is not priorTop. + if (priorTop == ((LocHeap*)mTimerContainer)->remove((LocRankable&)*mTimer)) { + // if passing in NULL, we tell updateSoonestTime to update kernel with + // the current top timer interval. + mTimerContainer->updateSoonestTime(NULL); } delete mTimer; } -- cgit v1.2.3