Changeset 240944 in webkit
- Timestamp:
- Feb 4, 2019, 2:30:31 PM (8 years ago)
- Location:
- trunk/Source
- Files:
-
- 13 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/css/CSSImageGeneratorValue.cpp (modified) (1 diff)
-
WebCore/html/HTMLPlugInImageElement.h (modified) (1 diff)
-
WebCore/loader/cache/CachedResource.h (modified) (1 diff)
-
WebCore/platform/Timer.cpp (modified) (5 diffs)
-
WebCore/platform/Timer.h (modified) (5 diffs)
-
WebCore/platform/graphics/ca/TileController.h (modified) (1 diff)
-
WebCore/platform/graphics/cg/SubimageCacheWithTimer.h (modified) (1 diff)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/NetworkProcess/watchos/NetworkProximityAssertion.h (modified) (1 diff)
-
WebKit/UIProcess/ResponsivenessTimer.cpp (modified) (1 diff)
-
WebKit/UIProcess/ResponsivenessTimer.h (modified) (1 diff)
-
WebKit/WebProcess/Plugins/PluginView.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r240943 r240944 1 2019-02-04 Benjamin Poulain <benjamin@webkit.org> 2 3 Use deferrable timer to restart the Responsiveness Timer on each wheel event 4 https://bugs.webkit.org/show_bug.cgi?id=194135 5 <rdar://problem/47724099> 6 7 Reviewed by Simon Fraser. 8 9 The original DeferrableOneShotTimer was not really deferrable. 10 What it allows is to restart the count down from scratch after 11 firing. 12 13 For this optimization, I want to keep the correct timing but avoid 14 starting a real timer every time. 15 16 I renamed DeferrableOneShotTimer to ResettableOneShotTimer and 17 created a real DeferrableOneShotTimer that support deadlines. 18 19 * css/CSSImageGeneratorValue.cpp: 20 * html/HTMLPlugInImageElement.h: 21 * loader/cache/CachedResource.h: 22 * platform/Timer.cpp: 23 (WebCore::DeferrableOneShotTimer::startOneShot): 24 (WebCore::DeferrableOneShotTimer::fired): 25 * platform/Timer.h: 26 (WebCore::TimerBase::nextFireTime const): 27 (WebCore::ResettableOneShotTimer::ResettableOneShotTimer): 28 (WebCore::DeferrableOneShotTimer::DeferrableOneShotTimer): 29 (WebCore::DeferrableOneShotTimer::stop): 30 (WebCore::DeferrableOneShotTimer::restart): Deleted. 31 * platform/graphics/ca/TileController.h: 32 * platform/graphics/cg/SubimageCacheWithTimer.h: 33 1 34 2019-02-04 Antoine Quint <graouts@apple.com> 2 35 -
trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp
r237276 r240944 57 57 const FloatSize m_size; 58 58 const Ref<GeneratedImage> m_image; 59 DeferrableOneShotTimer m_evictionTimer;59 ResettableOneShotTimer m_evictionTimer; 60 60 }; 61 61 -
trunk/Source/WebCore/html/HTMLPlugInImageElement.h
r229694 r240944 131 131 bool m_needsDocumentActivationCallbacks { false }; 132 132 RefPtr<MouseEvent> m_pendingClickEventFromSnapshot; 133 DeferrableOneShotTimer m_simulatedMouseClickTimer;133 ResettableOneShotTimer m_simulatedMouseClickTimer; 134 134 Timer m_removeSnapshotTimer; 135 135 RefPtr<Image> m_snapshotImage; -
trunk/Source/WebCore/loader/cache/CachedResource.h
r240014 r240944 312 312 ResourceResponse m_response; 313 313 314 DeferrableOneShotTimer m_decodedDataDeletionTimer;314 ResettableOneShotTimer m_decodedDataDeletionTimer; 315 315 316 316 // FIXME: Make the rest of these data members private and use functions in derived classes instead. -
trunk/Source/WebCore/platform/Timer.cpp
r239814 r240944 261 261 TimerBase::~TimerBase() 262 262 { 263 ASSERT(canAccessThreadLocalDataForThread(m_thread.get()));263 assertThreadSafety(); 264 264 RELEASE_ASSERT(canAccessThreadLocalDataForThread(m_thread.get()) || shouldSuppressThreadSafetyCheck()); 265 265 stop(); … … 274 274 void TimerBase::start(Seconds nextFireInterval, Seconds repeatInterval) 275 275 { 276 ASSERT(canAccessThreadLocalDataForThread(m_thread.get()));276 assertThreadSafety(); 277 277 278 278 m_repeatInterval = repeatInterval; … … 282 282 void TimerBase::stop() 283 283 { 284 ASSERT(canAccessThreadLocalDataForThread(m_thread.get()));284 assertThreadSafety(); 285 285 286 286 m_repeatInterval = 0_s; … … 466 466 void TimerBase::setNextFireTime(MonotonicTime newTime) 467 467 { 468 ASSERT(canAccessThreadLocalDataForThread(m_thread.get()));468 assertThreadSafety(); 469 469 RELEASE_ASSERT(canAccessThreadLocalDataForThread(m_thread.get()) || shouldSuppressThreadSafetyCheck()); 470 470 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!m_wasDeleted); … … 521 521 } 522 522 523 DeferrableOneShotTimer::DeferrableOneShotTimer(WTF::Function<void()>&& function) 524 : m_function(WTFMove(function)) 525 { 526 } 527 528 DeferrableOneShotTimer::~DeferrableOneShotTimer() = default; 529 530 void DeferrableOneShotTimer::startOneShot(Seconds interval) 531 { 532 assertThreadSafety(); 533 534 MonotonicTime oldNextFireTime = TimerBase::nextFireTime(); 535 if (!oldNextFireTime) { 536 m_restartFireTime = MonotonicTime(); 537 TimerBase::startOneShot(interval); 538 return; 539 } 540 541 MonotonicTime newNextFireTime = MonotonicTime::now() + interval; 542 if (newNextFireTime < oldNextFireTime) { 543 m_restartFireTime = MonotonicTime(); 544 TimerBase::setNextFireTime(newNextFireTime); 545 return; 546 } 547 548 m_restartFireTime = newNextFireTime; 549 } 550 551 void DeferrableOneShotTimer::stop() 552 { 553 TimerBase::stop(); 554 } 555 556 void DeferrableOneShotTimer::fired() 557 { 558 if (m_restartFireTime) { 559 MonotonicTime now = MonotonicTime::now(); 560 MonotonicTime restartFireTime = m_restartFireTime; 561 m_restartFireTime = MonotonicTime(); 562 if (now < restartFireTime) { 563 TimerBase::setNextFireTime(restartFireTime); 564 return; 565 } 566 } 567 568 m_function(); 569 } 570 523 571 } // namespace WebCore 524 572 -
trunk/Source/WebCore/platform/Timer.h
r239814 r240944 69 69 static void fireTimersInNestedEventLoop(); 70 70 71 protected: 72 MonotonicTime nextFireTime() const { return m_heapItem ? m_heapItem->time : MonotonicTime { }; } 73 void setNextFireTime(MonotonicTime); 74 75 void assertThreadSafety() 76 { 77 ASSERT(canAccessThreadLocalDataForThread(m_thread.get())); 78 } 79 71 80 private: 72 81 virtual void fired() = 0; … … 76 85 void checkConsistency() const; 77 86 void checkHeapIndex() const; 78 79 void setNextFireTime(MonotonicTime);80 87 81 88 bool inHeap() const { return m_heapItem && m_heapItem->isInHeap(); } … … 92 99 void heapPopMin(); 93 100 static void heapDeleteNullMin(ThreadTimerHeap&); 94 95 MonotonicTime nextFireTime() const { return m_heapItem ? m_heapItem->time : MonotonicTime { }; }96 101 97 102 MonotonicTime m_unalignedNextFireTime; // m_nextFireTime not considering alignment interval … … 142 147 } 143 148 144 class DeferrableOneShotTimer : protected TimerBase { 149 // ResettableOneShotTimer is a optimization for timers that need to be delayed frequently. 150 // 151 // Changing the deadline of a timer is not a cheap operation. When it is done frequently, it can 152 // affect performance. 153 // 154 // With ResettableOneShotTimer, calling restart() does not change the underlying timer. 155 // Instead, when the underlying timer fires, a new dealine is set for "delay" seconds. 156 // 157 // When a ResettableOneShotTimer of 5 seconds is restarted before the deadline, the total 158 // time before the function is called is 10 seconds. 159 // 160 // If a timer is unfrequently reset, or if it is usually stopped before the deadline, 161 // prefer WebCore::Timer to avoid idle wake-up. 162 class ResettableOneShotTimer : protected TimerBase { 145 163 WTF_MAKE_FAST_ALLOCATED; 146 164 public: 147 165 template<typename TimerFiredClass> 148 DeferrableOneShotTimer(TimerFiredClass& object, void (TimerFiredClass::*function)(), Seconds delay)149 : DeferrableOneShotTimer(std::bind(function, &object), delay)150 { 151 } 152 153 DeferrableOneShotTimer(WTF::Function<void()>&& function, Seconds delay)166 ResettableOneShotTimer(TimerFiredClass& object, void (TimerFiredClass::*function)(), Seconds delay) 167 : ResettableOneShotTimer(std::bind(function, &object), delay) 168 { 169 } 170 171 ResettableOneShotTimer(WTF::Function<void()>&& function, Seconds delay) 154 172 : m_function(WTFMove(function)) 155 173 , m_delay(delay) … … 197 215 }; 198 216 217 // DeferrableOneShotTimer is a optimization for timers that need to change the deadline frequently. 218 // 219 // With DeferrableOneShotTimer, if the new deadline is later than the original deadline, the timer 220 // is not reset. Instead, the timer fires and schedule a new timer for the remaining time. 221 // 222 // DeferrableOneShotTimer supports absolute deadlines. 223 // If a timer of 5 seconds is restarted after 2 seconds, the total time will be 7 seconds. 224 // 225 // Restarting a DeferrableOneShotTimer is more expensive than restarting a ResettableOneShotTimer. 226 // If accumulating the delay is not important, prefer ResettableOneShotTimer. 227 class WEBCORE_EXPORT DeferrableOneShotTimer : private TimerBase { 228 WTF_MAKE_FAST_ALLOCATED; 229 public: 230 DeferrableOneShotTimer(WTF::Function<void()>&&); 231 ~DeferrableOneShotTimer(); 232 233 void startOneShot(Seconds interval); 234 void stop(); 235 236 private: 237 void fired() override; 238 239 WTF::Function<void()> m_function; 240 MonotonicTime m_restartFireTime; 241 }; 242 199 243 } -
trunk/Source/WebCore/platform/graphics/ca/TileController.h
r239535 r240944 208 208 209 209 Timer m_tileRevalidationTimer; 210 DeferrableOneShotTimer m_tileSizeChangeTimer;210 ResettableOneShotTimer m_tileSizeChangeTimer; 211 211 212 212 TileCoverage m_tileCoverage { CoverageForVisibleArea }; -
trunk/Source/WebCore/platform/graphics/cg/SubimageCacheWithTimer.h
r232139 r240944 95 95 HashCountedSet<CGImageRef> m_images; 96 96 SubimageCacheHashSet m_cache; 97 DeferrableOneShotTimer m_timer;97 ResettableOneShotTimer m_timer; 98 98 99 99 static SubimageCacheWithTimer& subimageCache(); -
trunk/Source/WebKit/ChangeLog
r240940 r240944 1 2019-02-04 Benjamin Poulain <benjamin@webkit.org> 2 3 Use deferrable timer to restart the Responsiveness Timer on each wheel event 4 https://bugs.webkit.org/show_bug.cgi?id=194135 5 6 Reviewed by Simon Fraser. 7 8 Simon Fraser suggested a neat improvement over my previous optimization 9 of ResponsivenessTimer. 10 11 Instead of reseting the deadline with every event, we can let the timer 12 fire and add the missing time from the last start. 13 14 I implemented that behavior in the new Deferrable Timer class and use 15 it from ResponsivenessTimer. 16 17 * NetworkProcess/watchos/NetworkProximityAssertion.h: 18 * UIProcess/ResponsivenessTimer.h: 19 * WebProcess/Plugins/PluginView.h: 20 1 21 2019-02-04 Simon Fraser <simon.fraser@apple.com> 2 22 -
trunk/Source/WebKit/NetworkProcess/watchos/NetworkProximityAssertion.h
r234968 r240944 88 88 uint64_t m_assertionCount { 0 }; 89 89 State m_state { State::Suspended }; 90 WebCore:: DeferrableOneShotTimer m_releaseTimer;91 WebCore:: DeferrableOneShotTimer m_suspendAfterBackgroundingTimer;90 WebCore::ResettableOneShotTimer m_releaseTimer; 91 WebCore::ResettableOneShotTimer m_suspendAfterBackgroundingTimer; 92 92 }; 93 93 -
trunk/Source/WebKit/UIProcess/ResponsivenessTimer.cpp
r240759 r240944 33 33 ResponsivenessTimer::ResponsivenessTimer(ResponsivenessTimer::Client& client) 34 34 : m_client(client) 35 , m_timer( *this, &ResponsivenessTimer::timerFired)35 , m_timer(std::bind(&ResponsivenessTimer::timerFired, this)) 36 36 { 37 37 } -
trunk/Source/WebKit/UIProcess/ResponsivenessTimer.h
r240759 r240944 72 72 73 73 ResponsivenessTimer::Client& m_client; 74 WebCore:: Timer m_timer;74 WebCore::DeferrableOneShotTimer m_timer; 75 75 bool m_isResponsive { true }; 76 76 bool m_waitingForTimer { false }; -
trunk/Source/WebKit/WebProcess/Plugins/PluginView.h
r234920 r240944 285 285 RefPtr<ShareableBitmap> m_transientPaintingSnapshot; 286 286 // This timer is used when plugin snapshotting is enabled, to capture a plugin placeholder. 287 WebCore:: DeferrableOneShotTimer m_pluginSnapshotTimer;287 WebCore::ResettableOneShotTimer m_pluginSnapshotTimer; 288 288 #if ENABLE(PRIMARY_SNAPSHOTTED_PLUGIN_HEURISTIC) || PLATFORM(COCOA) 289 289 unsigned m_countSnapshotRetries { 0 };
Note:
See TracChangeset
for help on using the changeset viewer.