Changeset 247534 in webkit


Ignore:
Timestamp:
Jul 17, 2019 1:43:21 PM (5 years ago)
Author:
Chris Dumez
Message:

Avoid unnecessary copy of monitors under DisplayRefreshMonitorManager::displayWasUpdated()
https://bugs.webkit.org/show_bug.cgi?id=199847

Reviewed by Said Abou-Hallawa.

There is always one one monitor in m_monitors for a given displayID so there is
no need to copy the monitors inside DisplayRefreshMonitorManager::displayWasUpdated()
and no need to iterate over all of them. This patch also factors a bit differently
so that it becomes more obvious.

  • platform/graphics/DisplayRefreshMonitorManager.cpp:

(WebCore::DisplayRefreshMonitorManager::createMonitorForClient):
(WebCore::DisplayRefreshMonitorManager::unregisterClient):
(WebCore::DisplayRefreshMonitorManager::displayDidRefresh):
(WebCore::DisplayRefreshMonitorManager::displayWasUpdated):
(WebCore::DisplayRefreshMonitorManager::findMonitorForDisplay const):
(WebCore::DisplayRefreshMonitorManager::monitorForDisplay const):

  • platform/graphics/DisplayRefreshMonitorManager.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r247531 r247534  
     12019-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
    1222019-07-17  Sihui Liu  <sihui_liu@apple.com>
    223
  • trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitorManager.cpp

    r247459 r247534  
    4646{
    4747    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;
    5451    }
    5552
     
    7976
    8077    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)
    8980        return;
     81    RefPtr<DisplayRefreshMonitor> monitor = m_monitors[index].monitor;
     82    if (monitor->removeClient(client)) {
     83        if (!monitor->hasClients())
     84            m_monitors.remove(index);
    9085    }
    9186}
     
    110105    LOG(RequestAnimationFrame, "DisplayRefreshMonitorManager::displayDidRefresh() - destroying monitor %p", &monitor);
    111106
    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    });
    115110}
    116111
     
    129124void DisplayRefreshMonitorManager::displayWasUpdated(PlatformDisplayID displayID)
    130125{
    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
     131size_t DisplayRefreshMonitorManager::findMonitorForDisplayID(PlatformDisplayID displayID) const
     132{
     133    return m_monitors.findMatching([&](auto& monitorWrapper) {
     134        return monitorWrapper.monitor->displayID() == displayID;
    133135    });
    134     for (auto& monitor : monitors) {
    135         if (displayID == monitor->displayID() && monitor->hasRequestedRefreshCallback())
    136             monitor->displayLinkFired();
    137     }
     136}
     137
     138DisplayRefreshMonitor* DisplayRefreshMonitorManager::monitorForDisplayID(PlatformDisplayID displayID) const
     139{
     140    auto index = findMonitorForDisplayID(displayID);
     141    return index == notFound ? nullptr : m_monitors[index].monitor.get();
    138142}
    139143
  • trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitorManager.h

    r247273 r247534  
    5656    virtual ~DisplayRefreshMonitorManager();
    5757
     58    size_t findMonitorForDisplayID(PlatformDisplayID) const;
     59    DisplayRefreshMonitor* monitorForDisplayID(PlatformDisplayID) const;
     60
    5861    DisplayRefreshMonitor* createMonitorForClient(DisplayRefreshMonitorClient&);
    5962
Note: See TracChangeset for help on using the changeset viewer.