OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2009 Google Inc. All rights reserved. | 3 * Copyright (C) 2009 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 TimerHeapIterator operator--(int) { checkConsistency(-1); return TimerHeapIt
erator(m_pointer--); } | 120 TimerHeapIterator operator--(int) { checkConsistency(-1); return TimerHeapIt
erator(m_pointer--); } |
121 | 121 |
122 TimerHeapIterator& operator+=(ptrdiff_t i) { checkConsistency(); m_pointer +
= i; checkConsistency(); return *this; } | 122 TimerHeapIterator& operator+=(ptrdiff_t i) { checkConsistency(); m_pointer +
= i; checkConsistency(); return *this; } |
123 TimerHeapIterator& operator-=(ptrdiff_t i) { checkConsistency(); m_pointer -
= i; checkConsistency(); return *this; } | 123 TimerHeapIterator& operator-=(ptrdiff_t i) { checkConsistency(); m_pointer -
= i; checkConsistency(); return *this; } |
124 | 124 |
125 TimerHeapReference operator*() const { return TimerHeapReference(*m_pointer)
; } | 125 TimerHeapReference operator*() const { return TimerHeapReference(*m_pointer)
; } |
126 TimerHeapReference operator[](ptrdiff_t i) const { return TimerHeapReference
(m_pointer[i]); } | 126 TimerHeapReference operator[](ptrdiff_t i) const { return TimerHeapReference
(m_pointer[i]); } |
127 TimerBase* operator->() const { return *m_pointer; } | 127 TimerBase* operator->() const { return *m_pointer; } |
128 | 128 |
129 private: | 129 private: |
| 130 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
130 void checkConsistency(ptrdiff_t offset = 0) const | 131 void checkConsistency(ptrdiff_t offset = 0) const |
131 { | 132 { |
132 ASSERT(m_pointer >= threadGlobalTimerHeap().data()); | 133 ASSERT(m_pointer >= threadGlobalTimerHeap().data()); |
133 ASSERT(m_pointer <= threadGlobalTimerHeap().data() + threadGlobalTimerHe
ap().size()); | 134 ASSERT(m_pointer <= threadGlobalTimerHeap().data() + threadGlobalTimerHe
ap().size()); |
134 ASSERT_UNUSED(offset, m_pointer + offset >= threadGlobalTimerHeap().data
()); | 135 ASSERT_UNUSED(offset, m_pointer + offset >= threadGlobalTimerHeap().data
()); |
135 ASSERT_UNUSED(offset, m_pointer + offset <= threadGlobalTimerHeap().data
() + threadGlobalTimerHeap().size()); | 136 ASSERT_UNUSED(offset, m_pointer + offset <= threadGlobalTimerHeap().data
() + threadGlobalTimerHeap().size()); |
136 } | 137 } |
137 | 138 |
138 friend bool operator==(TimerHeapIterator, TimerHeapIterator); | 139 friend bool operator==(TimerHeapIterator, TimerHeapIterator); |
139 friend bool operator!=(TimerHeapIterator, TimerHeapIterator); | 140 friend bool operator!=(TimerHeapIterator, TimerHeapIterator); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 | 231 |
231 double TimerBase::nextFireInterval() const | 232 double TimerBase::nextFireInterval() const |
232 { | 233 { |
233 ASSERT(isActive()); | 234 ASSERT(isActive()); |
234 double current = monotonicallyIncreasingTime(); | 235 double current = monotonicallyIncreasingTime(); |
235 if (m_nextFireTime < current) | 236 if (m_nextFireTime < current) |
236 return 0; | 237 return 0; |
237 return m_nextFireTime - current; | 238 return m_nextFireTime - current; |
238 } | 239 } |
239 | 240 |
| 241 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
240 inline void TimerBase::checkHeapIndex() const | 242 inline void TimerBase::checkHeapIndex() const |
241 { | 243 { |
242 ASSERT(timerHeap() == threadGlobalTimerHeap()); | 244 ASSERT(timerHeap() == threadGlobalTimerHeap()); |
243 ASSERT(!timerHeap().isEmpty()); | 245 ASSERT(!timerHeap().isEmpty()); |
244 ASSERT(m_heapIndex >= 0); | 246 ASSERT(m_heapIndex >= 0); |
245 ASSERT(m_heapIndex < static_cast<int>(timerHeap().size())); | 247 ASSERT(m_heapIndex < static_cast<int>(timerHeap().size())); |
246 ASSERT(timerHeap()[m_heapIndex] == this); | 248 ASSERT(timerHeap()[m_heapIndex] == this); |
247 } | 249 } |
248 | 250 |
249 inline void TimerBase::checkConsistency() const | 251 inline void TimerBase::checkConsistency() const |
250 { | 252 { |
251 // Timers should be in the heap if and only if they have a non-zero next fir
e time. | 253 // Timers should be in the heap if and only if they have a non-zero next fir
e time. |
252 ASSERT(inHeap() == (m_nextFireTime != 0)); | 254 ASSERT(inHeap() == (m_nextFireTime != 0)); |
253 if (inHeap()) | 255 if (inHeap()) |
254 checkHeapIndex(); | 256 checkHeapIndex(); |
255 } | 257 } |
256 | 258 |
257 void TimerBase::heapDecreaseKey() | 259 void TimerBase::heapDecreaseKey() |
258 { | 260 { |
259 ASSERT(m_nextFireTime != 0); | 261 ASSERT(m_nextFireTime != 0); |
260 checkHeapIndex(); | 262 checkHeapIndex(); |
261 TimerBase** heapData = timerHeap().data(); | 263 TimerBase** heapData = timerHeap().data(); |
262 push_heap(TimerHeapIterator(heapData), TimerHeapIterator(heapData + m_heapIn
dex + 1), TimerHeapLessThanFunction()); | 264 push_heap(TimerHeapIterator(heapData), TimerHeapIterator(heapData + m_heapIn
dex + 1), TimerHeapLessThanFunction()); |
263 checkHeapIndex(); | 265 checkHeapIndex(); |
264 } | 266 } |
265 | 267 |
| 268 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
266 inline void TimerBase::heapDelete() | 269 inline void TimerBase::heapDelete() |
267 { | 270 { |
268 ASSERT(m_nextFireTime == 0); | 271 ASSERT(m_nextFireTime == 0); |
269 heapPop(); | 272 heapPop(); |
270 timerHeap().removeLast(); | 273 timerHeap().removeLast(); |
271 m_heapIndex = -1; | 274 m_heapIndex = -1; |
272 } | 275 } |
273 | 276 |
| 277 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
274 void TimerBase::heapDeleteMin() | 278 void TimerBase::heapDeleteMin() |
275 { | 279 { |
276 ASSERT(m_nextFireTime == 0); | 280 ASSERT(m_nextFireTime == 0); |
277 heapPopMin(); | 281 heapPopMin(); |
278 timerHeap().removeLast(); | 282 timerHeap().removeLast(); |
279 m_heapIndex = -1; | 283 m_heapIndex = -1; |
280 } | 284 } |
281 | 285 |
282 inline void TimerBase::heapIncreaseKey() | 286 inline void TimerBase::heapIncreaseKey() |
283 { | 287 { |
(...skipping 14 matching lines...) Expand all Loading... |
298 inline void TimerBase::heapPop() | 302 inline void TimerBase::heapPop() |
299 { | 303 { |
300 // Temporarily force this timer to have the minimum key so we can pop it. | 304 // Temporarily force this timer to have the minimum key so we can pop it. |
301 double fireTime = m_nextFireTime; | 305 double fireTime = m_nextFireTime; |
302 m_nextFireTime = -std::numeric_limits<double>::infinity(); | 306 m_nextFireTime = -std::numeric_limits<double>::infinity(); |
303 heapDecreaseKey(); | 307 heapDecreaseKey(); |
304 heapPopMin(); | 308 heapPopMin(); |
305 m_nextFireTime = fireTime; | 309 m_nextFireTime = fireTime; |
306 } | 310 } |
307 | 311 |
| 312 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
308 void TimerBase::heapPopMin() | 313 void TimerBase::heapPopMin() |
309 { | 314 { |
310 ASSERT(this == timerHeap().first()); | 315 ASSERT(this == timerHeap().first()); |
311 checkHeapIndex(); | 316 checkHeapIndex(); |
312 Vector<TimerBase*>& heap = timerHeap(); | 317 Vector<TimerBase*>& heap = timerHeap(); |
313 TimerBase** heapData = heap.data(); | 318 TimerBase** heapData = heap.data(); |
314 pop_heap(TimerHeapIterator(heapData), TimerHeapIterator(heapData + heap.size
()), TimerHeapLessThanFunction()); | 319 pop_heap(TimerHeapIterator(heapData), TimerHeapIterator(heapData + heap.size
()), TimerHeapLessThanFunction()); |
315 checkHeapIndex(); | 320 checkHeapIndex(); |
316 ASSERT(this == timerHeap().last()); | 321 ASSERT(this == timerHeap().last()); |
317 } | 322 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 else if (!m_nextFireTime) | 366 else if (!m_nextFireTime) |
362 heapDelete(); | 367 heapDelete(); |
363 else if (m_nextFireTime < oldTime) | 368 else if (m_nextFireTime < oldTime) |
364 heapDecreaseKey(); | 369 heapDecreaseKey(); |
365 else | 370 else |
366 heapIncreaseKey(); | 371 heapIncreaseKey(); |
367 ASSERT(m_heapIndex != oldHeapIndex); | 372 ASSERT(m_heapIndex != oldHeapIndex); |
368 ASSERT(!inHeap() || hasValidHeapPosition()); | 373 ASSERT(!inHeap() || hasValidHeapPosition()); |
369 } | 374 } |
370 | 375 |
| 376 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
371 void TimerBase::setNextFireTime(double newUnalignedTime) | 377 void TimerBase::setNextFireTime(double newUnalignedTime) |
372 { | 378 { |
373 ASSERT(m_thread == currentThread()); | 379 ASSERT(m_thread == currentThread()); |
374 | 380 |
375 if (m_unalignedNextFireTime != newUnalignedTime) | 381 if (m_unalignedNextFireTime != newUnalignedTime) |
376 m_unalignedNextFireTime = newUnalignedTime; | 382 m_unalignedNextFireTime = newUnalignedTime; |
377 | 383 |
378 // Accessing thread global data is slow. Cache the heap pointer. | 384 // Accessing thread global data is slow. Cache the heap pointer. |
379 if (!m_cachedThreadGlobalTimerHeap) | 385 if (!m_cachedThreadGlobalTimerHeap) |
380 m_cachedThreadGlobalTimerHeap = &threadGlobalTimerHeap(); | 386 m_cachedThreadGlobalTimerHeap = &threadGlobalTimerHeap(); |
(...skipping 24 matching lines...) Expand all Loading... |
405 setNextFireTime(m_unalignedNextFireTime); | 411 setNextFireTime(m_unalignedNextFireTime); |
406 } | 412 } |
407 | 413 |
408 double TimerBase::nextUnalignedFireInterval() const | 414 double TimerBase::nextUnalignedFireInterval() const |
409 { | 415 { |
410 ASSERT(isActive()); | 416 ASSERT(isActive()); |
411 return std::max(m_unalignedNextFireTime - monotonicallyIncreasingTime(), 0.0
); | 417 return std::max(m_unalignedNextFireTime - monotonicallyIncreasingTime(), 0.0
); |
412 } | 418 } |
413 | 419 |
414 } // namespace blink | 420 } // namespace blink |
OLD | NEW |