Changeset 247534 in webkit
- Timestamp:
- Jul 17, 2019 1:43:21 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r247531 r247534 1 2019-07-17 Chris Dumez <cdumez@apple.com> 2 3 Avoid unnecessary copy of monitors under DisplayRefreshMonitorManager::displayWasUpdated() 4 https://bugs.webkit.org/show_bug.cgi?id=199847 5 6 Reviewed by Said Abou-Hallawa. 7 8 There is always one one monitor in m_monitors for a given displayID so there is 9 no need to copy the monitors inside DisplayRefreshMonitorManager::displayWasUpdated() 10 and no need to iterate over all of them. This patch also factors a bit differently 11 so that it becomes more obvious. 12 13 * platform/graphics/DisplayRefreshMonitorManager.cpp: 14 (WebCore::DisplayRefreshMonitorManager::createMonitorForClient): 15 (WebCore::DisplayRefreshMonitorManager::unregisterClient): 16 (WebCore::DisplayRefreshMonitorManager::displayDidRefresh): 17 (WebCore::DisplayRefreshMonitorManager::displayWasUpdated): 18 (WebCore::DisplayRefreshMonitorManager::findMonitorForDisplay const): 19 (WebCore::DisplayRefreshMonitorManager::monitorForDisplay const): 20 * platform/graphics/DisplayRefreshMonitorManager.h: 21 1 22 2019-07-17 Sihui Liu <sihui_liu@apple.com> 2 23 -
trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitorManager.cpp
r247459 r247534 46 46 { 47 47 PlatformDisplayID clientDisplayID = client.displayID(); 48 for (auto& monitorWrapper : m_monitors) { 49 auto& monitor = monitorWrapper.monitor; 50 if (monitor->displayID() != clientDisplayID) 51 continue; 52 monitor->addClient(client); 53 return monitor.get(); 48 if (auto* existingMonitor = monitorForDisplayID(clientDisplayID)) { 49 existingMonitor->addClient(client); 50 return existingMonitor; 54 51 } 55 52 … … 79 76 80 77 PlatformDisplayID clientDisplayID = client.displayID(); 81 for (size_t i = 0; i < m_monitors.size(); ++i) { 82 RefPtr<DisplayRefreshMonitor> monitor = m_monitors[i].monitor; 83 if (monitor->displayID() != clientDisplayID) 84 continue; 85 if (monitor->removeClient(client)) { 86 if (!monitor->hasClients()) 87 m_monitors.remove(i); 88 } 78 auto index = findMonitorForDisplayID(clientDisplayID); 79 if (index == notFound) 89 80 return; 81 RefPtr<DisplayRefreshMonitor> monitor = m_monitors[index].monitor; 82 if (monitor->removeClient(client)) { 83 if (!monitor->hasClients()) 84 m_monitors.remove(index); 90 85 } 91 86 } … … 110 105 LOG(RequestAnimationFrame, "DisplayRefreshMonitorManager::displayDidRefresh() - destroying monitor %p", &monitor); 111 106 112 size_t monitorIndex = m_monitors.findMatching([&](auto& monitorWrapper) { return monitorWrapper.monitor == &monitor; });113 if (monitorIndex != notFound)114 m_monitors.remove(monitorIndex);107 m_monitors.removeFirstMatching([&](auto& monitorWrapper) { 108 return monitorWrapper.monitor == &monitor; 109 }); 115 110 } 116 111 … … 129 124 void DisplayRefreshMonitorManager::displayWasUpdated(PlatformDisplayID displayID) 130 125 { 131 Vector<RefPtr<DisplayRefreshMonitor>> monitors = WTF::map(m_monitors, [](auto& monitorWrapper) { 132 return monitorWrapper.monitor; 126 auto* monitor = monitorForDisplayID(displayID); 127 if (monitor && monitor->hasRequestedRefreshCallback()) 128 monitor->displayLinkFired(); 129 } 130 131 size_t DisplayRefreshMonitorManager::findMonitorForDisplayID(PlatformDisplayID displayID) const 132 { 133 return m_monitors.findMatching([&](auto& monitorWrapper) { 134 return monitorWrapper.monitor->displayID() == displayID; 133 135 }); 134 for (auto& monitor : monitors) { 135 if (displayID == monitor->displayID() && monitor->hasRequestedRefreshCallback()) 136 monitor->displayLinkFired(); 137 } 136 } 137 138 DisplayRefreshMonitor* DisplayRefreshMonitorManager::monitorForDisplayID(PlatformDisplayID displayID) const 139 { 140 auto index = findMonitorForDisplayID(displayID); 141 return index == notFound ? nullptr : m_monitors[index].monitor.get(); 138 142 } 139 143 -
trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitorManager.h
r247273 r247534 56 56 virtual ~DisplayRefreshMonitorManager(); 57 57 58 size_t findMonitorForDisplayID(PlatformDisplayID) const; 59 DisplayRefreshMonitor* monitorForDisplayID(PlatformDisplayID) const; 60 58 61 DisplayRefreshMonitor* createMonitorForClient(DisplayRefreshMonitorClient&); 59 62
Note: See TracChangeset
for help on using the changeset viewer.