diff options
author | Kevin Tang <zhikait@codeaurora.org> | 2015-09-15 19:02:58 -0700 |
---|---|---|
committer | Kevin Tang <zhikait@codeaurora.org> | 2015-09-18 09:30:33 -0700 |
commit | 088a127c3117c4b4b40d303a51b99d709062eef2 (patch) | |
tree | fd5ced163ce4b6ab6390bc6ab3323eac4c034349 | |
parent | 9957a19f5f522d9e010020b5bcad3e91dfc599ca (diff) | |
download | gps-088a127c3117c4b4b40d303a51b99d709062eef2.tar.gz |
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
-rw-r--r-- | utils/LocHeap.cpp | 4 | ||||
-rw-r--r-- | utils/LocTimer.cpp | 8 |
2 files changed, 8 insertions, 4 deletions
diff --git a/utils/LocHeap.cpp b/utils/LocHeap.cpp index 4126878..d667f14 100644 --- a/utils/LocHeap.cpp +++ b/utils/LocHeap.cpp @@ -199,7 +199,7 @@ bool LocHeapNode::checkNodes() { int totalSize = mSize; if (mLeft) { // check the consistency of left subtree - if (!outRanks(*mLeft) || !mLeft->checkNodes()) { + if (mLeft->outRanks(*this) || !mLeft->checkNodes()) { return false; } // subtract the size of left subtree (with subtree head) @@ -208,7 +208,7 @@ bool LocHeapNode::checkNodes() { if (mRight) { // check the consistency of right subtree - if (!outRanks(*mRight) || !mRight->checkNodes()) { + if (mRight->outRanks(*this) || !mRight->checkNodes()) { return false; } // subtract the size of right subtree (with subtree head) 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; } |