Title: [266710] trunk/Source
Revision
266710
Author
[email protected]
Date
2020-09-07 13:55:31 -0700 (Mon, 07 Sep 2020)

Log Message

Unreviewed, reverting r266645.
https://bugs.webkit.org/show_bug.cgi?id=216251

Caused MotionMark regression

Reverted changeset:

"Move lazy DisplayLink tear down logic from the WebProcess to
the UIProcess"
https://bugs.webkit.org/show_bug.cgi?id=216195
https://trac.webkit.org/changeset/266645

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (266709 => 266710)


--- trunk/Source/WebCore/ChangeLog	2020-09-07 19:36:53 UTC (rev 266709)
+++ trunk/Source/WebCore/ChangeLog	2020-09-07 20:55:31 UTC (rev 266710)
@@ -1,3 +1,17 @@
+2020-09-07  Commit Queue  <[email protected]>
+
+        Unreviewed, reverting r266645.
+        https://bugs.webkit.org/show_bug.cgi?id=216251
+
+        Caused MotionMark regression
+
+        Reverted changeset:
+
+        "Move lazy DisplayLink tear down logic from the WebProcess to
+        the UIProcess"
+        https://bugs.webkit.org/show_bug.cgi?id=216195
+        https://trac.webkit.org/changeset/266645
+
 2020-09-07  Sam Weinig  <[email protected]>
 
         [WebIDL] Fix issues found by preprocess-idls.pl parser validation and enabled parser validation by default for the tests

Modified: trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp (266709 => 266710)


--- trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp	2020-09-07 19:36:53 UTC (rev 266709)
+++ trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp	2020-09-07 20:55:31 UTC (rev 266710)
@@ -94,7 +94,12 @@
 {
     {
         LockHolder lock(m_mutex);
-        LOG(RequestAnimationFrame, "DisplayRefreshMonitor::displayDidRefresh(%p) - m_scheduled(%d)", this, m_scheduled);
+        LOG(RequestAnimationFrame, "DisplayRefreshMonitor::displayDidRefresh(%p) - m_scheduled(%d), m_unscheduledFireCount(%d)", this, m_scheduled, m_unscheduledFireCount);
+        if (!m_scheduled)
+            ++m_unscheduledFireCount;
+        else
+            m_unscheduledFireCount = 0;
+
         m_scheduled = false;
     }
 

Modified: trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.h (266709 => 266710)


--- trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.h	2020-09-07 19:36:53 UTC (rev 266709)
+++ trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.h	2020-09-07 20:55:31 UTC (rev 266710)
@@ -60,7 +60,11 @@
     
     PlatformDisplayID displayID() const { return m_displayID; }
 
-    bool shouldBeTerminated() const { return !m_scheduled; }
+    bool shouldBeTerminated() const
+    {
+        const int maxInactiveFireCount = 20;
+        return !m_scheduled && m_unscheduledFireCount > maxInactiveFireCount;
+    }
 
     static RefPtr<DisplayRefreshMonitor> createDefaultDisplayRefreshMonitor(PlatformDisplayID);
 
@@ -90,6 +94,7 @@
     HashSet<DisplayRefreshMonitorClient*>* m_clientsToBeNotified { nullptr };
     Lock m_mutex;
     PlatformDisplayID m_displayID { 0 };
+    int m_unscheduledFireCount { 0 }; // Number of times the display link has fired with no clients.
     bool m_active { true };
     bool m_scheduled { false };
     bool m_previousFrameDone { true };

Modified: trunk/Source/WebKit/ChangeLog (266709 => 266710)


--- trunk/Source/WebKit/ChangeLog	2020-09-07 19:36:53 UTC (rev 266709)
+++ trunk/Source/WebKit/ChangeLog	2020-09-07 20:55:31 UTC (rev 266710)
@@ -1,3 +1,17 @@
+2020-09-07  Commit Queue  <[email protected]>
+
+        Unreviewed, reverting r266645.
+        https://bugs.webkit.org/show_bug.cgi?id=216251
+
+        Caused MotionMark regression
+
+        Reverted changeset:
+
+        "Move lazy DisplayLink tear down logic from the WebProcess to
+        the UIProcess"
+        https://bugs.webkit.org/show_bug.cgi?id=216195
+        https://trac.webkit.org/changeset/266645
+
 2020-09-07  Mike Gorse  <[email protected]>
 
         Build failure; cannot find seccomp.h

Modified: trunk/Source/WebKit/UIProcess/mac/DisplayLink.cpp (266709 => 266710)


--- trunk/Source/WebKit/UIProcess/mac/DisplayLink.cpp	2020-09-07 19:36:53 UTC (rev 266709)
+++ trunk/Source/WebKit/UIProcess/mac/DisplayLink.cpp	2020-09-07 20:55:31 UTC (rev 266710)
@@ -32,8 +32,6 @@
 #include <wtf/ProcessPrivilege.h>
 
 namespace WebKit {
-
-constexpr unsigned maxFireCountWithObservers { 20 };
     
 DisplayLink::DisplayLink(WebCore::PlatformDisplayID displayID)
     : m_displayID(displayID)
@@ -74,13 +72,16 @@
 void DisplayLink::addObserver(IPC::Connection& connection, DisplayLinkObserverID observerID)
 {
     ASSERT(RunLoop::isMain());
+    bool isRunning = !m_observers.isEmpty();
 
-    LockHolder locker(m_observersLock);
-    m_observers.ensure(&connection, [] {
-        return Vector<DisplayLinkObserverID> { };
-    }).iterator->value.append(observerID);
+    {
+        LockHolder locker(m_observersLock);
+        m_observers.ensure(&connection, [] {
+            return Vector<DisplayLinkObserverID> { };
+        }).iterator->value.append(observerID);
+    }
 
-    if (!CVDisplayLinkIsRunning(m_displayLink)) {
+    if (!isRunning) {
         CVReturn error = CVDisplayLinkStart(m_displayLink);
         if (error)
             WTFLogAlways("Could not start the display link: %d", error);
@@ -91,19 +92,20 @@
 {
     ASSERT(RunLoop::isMain());
 
-    LockHolder locker(m_observersLock);
+    {
+        LockHolder locker(m_observersLock);
 
-    auto it = m_observers.find(&connection);
-    if (it == m_observers.end())
-        return;
-    bool removed = it->value.removeFirst(observerID);
-    ASSERT_UNUSED(removed, removed);
-    if (it->value.isEmpty())
-        m_observers.remove(it);
+        auto it = m_observers.find(&connection);
+        if (it == m_observers.end())
+            return;
+        bool removed = it->value.removeFirst(observerID);
+        ASSERT_UNUSED(removed, removed);
+        if (it->value.isEmpty())
+            m_observers.remove(it);
+    }
 
-    // We do not stop the display link right away when |m_observers| becomes empty. Instead, we
-    // let the display link fire up to |maxFireCountWithObservers| times without observers to avoid
-    // killing & restarting too many threads when observers gets removed & added in quick succession.
+    if (m_observers.isEmpty())
+        CVDisplayLinkStop(m_displayLink);
 }
 
 void DisplayLink::removeObservers(IPC::Connection& connection)
@@ -110,27 +112,25 @@
 {
     ASSERT(RunLoop::isMain());
 
-    LockHolder locker(m_observersLock);
-    m_observers.remove(&connection);
+    {
+        LockHolder locker(m_observersLock);
+        m_observers.remove(&connection);
+    }
 
-    // We do not stop the display link right away when |m_observers| becomes empty. Instead, we
-    // let the display link fire up to |maxFireCountWithObservers| times without observers to avoid
-    // killing & restarting too many threads when observers gets removed & added in quick succession.
+    if (m_observers.isEmpty())
+        CVDisplayLinkStop(m_displayLink);
 }
 
+bool DisplayLink::hasObservers() const
+{
+    ASSERT(RunLoop::isMain());
+    return !m_observers.isEmpty();
+}
+
 CVReturn DisplayLink::displayLinkCallback(CVDisplayLinkRef displayLinkRef, const CVTimeStamp*, const CVTimeStamp*, CVOptionFlags, CVOptionFlags*, void* data)
 {
-    ASSERT(!RunLoop::isMain());
     auto* displayLink = static_cast<DisplayLink*>(data);
-
     LockHolder locker(displayLink->m_observersLock);
-    if (displayLink->m_observers.isEmpty()) {
-        if (++(displayLink->m_fireCountWithoutObservers) >= maxFireCountWithObservers)
-            CVDisplayLinkStop(displayLink->m_displayLink);
-        return kCVReturnSuccess;
-    }
-    displayLink->m_fireCountWithoutObservers = 0;
-
     for (auto& connection : displayLink->m_observers.keys())
         connection->send(Messages::EventDispatcher::DisplayWasRefreshed(displayLink->m_displayID), 0);
     return kCVReturnSuccess;

Modified: trunk/Source/WebKit/UIProcess/mac/DisplayLink.h (266709 => 266710)


--- trunk/Source/WebKit/UIProcess/mac/DisplayLink.h	2020-09-07 19:36:53 UTC (rev 266709)
+++ trunk/Source/WebKit/UIProcess/mac/DisplayLink.h	2020-09-07 20:55:31 UTC (rev 266710)
@@ -48,6 +48,7 @@
     void addObserver(IPC::Connection&, DisplayLinkObserverID);
     void removeObserver(IPC::Connection&, DisplayLinkObserverID);
     void removeObservers(IPC::Connection&);
+    bool hasObservers() const;
 
     WebCore::PlatformDisplayID displayID() const { return m_displayID; }
     
@@ -60,7 +61,6 @@
     Lock m_observersLock;
     HashMap<RefPtr<IPC::Connection>, Vector<DisplayLinkObserverID>> m_observers;
     WebCore::PlatformDisplayID m_displayID;
-    unsigned m_fireCountWithoutObservers { 0 };
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to