Changeset 247459 in webkit


Ignore:
Timestamp:
Jul 15, 2019 4:06:58 PM (5 years ago)
Author:
Chris Dumez
Message:

Crash under DisplayRefreshMonitorManager::displayWasUpdated()
https://bugs.webkit.org/show_bug.cgi?id=199808
<rdar://problem/53070144>

Reviewed by Geoffrey Garen.

Copy m_monitors before iterating over it because the calling displayLinkFired() on the
monitor may end up calling DisplayRefreshMonitorManager::displayDidRefresh() synchronously,
which removes the monitor from m_monitors.

  • platform/graphics/DisplayRefreshMonitorManager.cpp:

(WebCore::DisplayRefreshMonitorManager::displayWasUpdated):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r247457 r247459  
     12019-07-15  Chris Dumez  <cdumez@apple.com>
     2
     3        Crash under DisplayRefreshMonitorManager::displayWasUpdated()
     4        https://bugs.webkit.org/show_bug.cgi?id=199808
     5        <rdar://problem/53070144>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Copy m_monitors before iterating over it because the calling displayLinkFired() on the
     10        monitor may end up calling DisplayRefreshMonitorManager::displayDidRefresh() synchronously,
     11        which removes the monitor from m_monitors.
     12
     13        * platform/graphics/DisplayRefreshMonitorManager.cpp:
     14        (WebCore::DisplayRefreshMonitorManager::displayWasUpdated):
     15
    1162019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
    217
  • trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitorManager.cpp

    r247273 r247459  
    129129void DisplayRefreshMonitorManager::displayWasUpdated(PlatformDisplayID displayID)
    130130{
    131     for (const auto& monitorWrapper : m_monitors) {
    132         auto& monitor = monitorWrapper.monitor;
     131    Vector<RefPtr<DisplayRefreshMonitor>> monitors = WTF::map(m_monitors, [](auto& monitorWrapper) {
     132        return monitorWrapper.monitor;
     133    });
     134    for (auto& monitor : monitors) {
    133135        if (displayID == monitor->displayID() && monitor->hasRequestedRefreshCallback())
    134136            monitor->displayLinkFired();
Note: See TracChangeset for help on using the changeset viewer.