WebCore:
[WebKit-https.git] / WebCore / platform / Timer.cpp
index ee2f95970bb15eebe9f2810b6ec39ab9126cbd12..bf2eeefb6852f110ace780c962bdeaf3b67f2b2c 100644 (file)
@@ -94,9 +94,17 @@ inline TimerHeapElement& TimerHeapElement::operator=(const TimerHeapElement& o)
 
 inline bool operator<(const TimerHeapElement& a, const TimerHeapElement& b)
 {
-    // Note, this is "backwards" because the heap puts the largest element first
-    // and we want the lowest time to be the first one in the heap.
-    return b.timer()->m_nextFireTime < a.timer()->m_nextFireTime;
+    // The comparisons below are "backwards" because the heap puts the largest 
+    // element first and we want the lowest time to be the first one in the heap.
+    double aFireTime = a.timer()->m_nextFireTime;
+    double bFireTime = b.timer()->m_nextFireTime;
+    if (bFireTime != aFireTime)
+        return bFireTime < aFireTime;
+    
+    // We need to look at the difference of the insertion orders instead of comparing the two 
+    // outright in case of overflow. 
+    unsigned difference = a.timer()->m_heapInsertionOrder - b.timer()->m_heapInsertionOrder;
+    return difference < UINT_MAX / 2;
 }
 
 // ----------------
@@ -284,6 +292,8 @@ void TimerBase::setNextFireTime(double newTime)
     double oldTime = m_nextFireTime;
     if (oldTime != newTime) {
         m_nextFireTime = newTime;
+        static unsigned currentHeapInsertionOrder;
+        m_heapInsertionOrder = currentHeapInsertionOrder++;
 
         bool wasFirstTimerInHeap = m_heapIndex == 0;