Index: Source/platform/TimerHeapEntry.h |
diff --git a/Source/platform/TimerHeapEntry.h b/Source/platform/TimerHeapEntry.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c6366a2554806a5cf5198512edb757277f57618f |
--- /dev/null |
+++ b/Source/platform/TimerHeapEntry.h |
@@ -0,0 +1,70 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef TimerHeapEntry_h |
+#define TimerHeapEntry_h |
+ |
+#include "wtf/Noncopyable.h" |
+#include <stddef.h> |
+ |
+namespace blink { |
+ |
+class TimerBase; |
+class TimerHeap; |
+ |
+// TimerHeapEntry is all of the state TimerHeap maintains about a |
+// timer. Because even repeating timers are only scheduled once (for |
+// the next time they're fired) as a result there's only one entry for |
+// a timer. For this reason TimerHeapEntry is stored inline as part of |
+// the TimerBase. |
+class TimerHeapEntry { |
+ WTF_MAKE_NONCOPYABLE(TimerHeapEntry); |
+public: |
+ explicit TimerHeapEntry(TimerHeap*); |
+ virtual ~TimerHeapEntry(); |
+ |
+ // FIXME: TimerBase uses setValue(0) to mean "not scheduled" but |
+ // it may be simpler to make this explicit. |
+ double value() const { return m_value; } |
+ void setValue(TimerBase&, double newValue); |
+ |
+ bool inHeap() const { return m_state & TimerHeapEntryInHeap; } |
+ |
+private: |
+ friend class TimerHeap; |
+ friend class TimerHeapLessThanFunction; |
+ friend class TimerHeapReference; |
+ |
+ // The heap this entry is in when the timer is scheduled. There's |
+ // one timer heap per thread, and timers don't jump threads, so |
+ // this is fixed for the life of the timer. |
+ TimerHeap* m_owner; |
+ |
+ enum State { |
+ TimerHeapEntryNotInHeap, |
+ TimerHeapEntryInHeap, |
+ TimerHeapEntryInHeap_ForcedMinimumForPopping = 3 |
+ }; |
+ State m_state; |
+ |
+ // The next fire time. The timer heap doesn't particularly care |
+ // that this is a time; it's just part of the (m_value, |
+ // m_heapInsertionOrder) key in the min-heap. |
+ double m_value; |
+ |
+ // This is assigned from an incrementing counter. When comparing |
+ // entries which have the same m_value, the comparison falls back |
+ // to m_heapInsertionOrder which means timers scheduled for the |
+ // same time will always fire in the order that they were |
+ // scheduled in. |
+ size_t m_heapInsertionOrder; |
+ |
+ // If the timer is in the heap, the position of the timer in the |
+ // heap. |
+ size_t m_heapIndex; |
+}; |
+ |
+} // namespace blink |
+ |
+#endif // TimerHeapEntry_h |