void TimeoutManager::Timeouts::Insert(Timeout* aTimeout, SortBy aSortBy) { // Start at mLastTimeout and go backwards. Don't go further than insertion // point, though. This optimizes for the common case of insertion at the end. Timeout* prevSibling; for (prevSibling = GetLast(); prevSibling && prevSibling != InsertionPoint() && // This condition needs to match the one in SetTimeoutOrInterval that // determines whether to set When() or TimeRemaining(). (aSortBy == SortBy::TimeRemaining ? prevSibling->TimeRemaining() > aTimeout->TimeRemaining() : prevSibling->When() > aTimeout->When()); prevSibling = prevSibling->getPrevious()) { /* Do nothing; just searching */ } // Now link in aTimeout after prevSibling. if (prevSibling) { prevSibling->setNext(aTimeout); } else { InsertFront(aTimeout); } aTimeout->mFiringDepth = 0; // Increment the timeout's reference count since it's now held on to // by the list aTimeout->AddRef(); }
void TimeoutManager::Timeouts::Insert(Timeout* aTimeout, SortBy aSortBy) { // Start at mLastTimeout and go backwards. Stop if we see a Timeout with a // valid FiringId since those timers are currently being processed by // RunTimeout. This optimizes for the common case of insertion at the end. Timeout* prevSibling; for (prevSibling = GetLast(); prevSibling && // This condition needs to match the one in SetTimeoutOrInterval that // determines whether to set When() or TimeRemaining(). (aSortBy == SortBy::TimeRemaining ? prevSibling->TimeRemaining() > aTimeout->TimeRemaining() : prevSibling->When() > aTimeout->When()) && // Check the firing ID last since it will evaluate true in the vast // majority of cases. mManager.IsInvalidFiringId(prevSibling->mFiringId); prevSibling = prevSibling->getPrevious()) { /* Do nothing; just searching */ } // Now link in aTimeout after prevSibling. if (prevSibling) { prevSibling->setNext(aTimeout); } else { InsertFront(aTimeout); } aTimeout->mFiringId = InvalidFiringId; }