Send display link IPC message from display link thread.
authorpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Jun 2018 18:30:01 +0000 (18:30 +0000)
committerpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Jun 2018 18:30:01 +0000 (18:30 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186429

Reviewed by Geoffrey Garen.

When the display link callback is firing on the display link thread in the UI process,
we schedule a function to be called on the main thread to send the IPC message to the
WebContent process. Since Connection::send is thread-safe, we can just send the message
from the display link thread, instead. This should be a small performance improvement.

* UIProcess/mac/DisplayLink.cpp:
(WebKit::DisplayLink::DisplayLink):
(WebKit::DisplayLink::displayLinkCallback):
* UIProcess/mac/DisplayLink.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@232632 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/mac/DisplayLink.cpp
Source/WebKit/UIProcess/mac/DisplayLink.h

index d2fbb2d..61c1ddc 100644 (file)
@@ -1,3 +1,20 @@
+2018-06-08  Per Arne Vollan  <pvollan@apple.com>
+
+        Send display link IPC message from display link thread.
+        https://bugs.webkit.org/show_bug.cgi?id=186429
+
+        Reviewed by Geoffrey Garen.
+
+        When the display link callback is firing on the display link thread in the UI process,
+        we schedule a function to be called on the main thread to send the IPC message to the
+        WebContent process. Since Connection::send is thread-safe, we can just send the message
+        from the display link thread, instead. This should be a small performance improvement.
+
+        * UIProcess/mac/DisplayLink.cpp:
+        (WebKit::DisplayLink::DisplayLink):
+        (WebKit::DisplayLink::displayLinkCallback):
+        * UIProcess/mac/DisplayLink.h:
+
 2018-06-07  Chris Dumez  <cdumez@apple.com>
 
         Add base class to get WeakPtrFactory member and avoid some boilerplate code
index bab075b..04e393e 100644 (file)
@@ -36,6 +36,8 @@
 namespace WebKit {
     
 DisplayLink::DisplayLink(WebCore::PlatformDisplayID displayID, WebPageProxy& webPageProxy)
+    : m_connection(webPageProxy.process().connection())
+    , m_pageID(webPageProxy.pageID())
 {
     ASSERT(hasProcessPrivilege(ProcessPrivilege::CanCommunicateWithWindowServer));
     CVReturn error = CVDisplayLinkCreateWithCGDisplay(displayID, &m_displayLink);
@@ -44,7 +46,7 @@ DisplayLink::DisplayLink(WebCore::PlatformDisplayID displayID, WebPageProxy& web
         return;
     }
     
-    error = CVDisplayLinkSetOutputCallback(m_displayLink, displayLinkCallback, &webPageProxy);
+    error = CVDisplayLinkSetOutputCallback(m_displayLink, displayLinkCallback, this);
     if (error) {
         WTFLogAlways("Could not set the display link output callback: %d", error);
         return;
@@ -97,11 +99,8 @@ void DisplayLink::resume()
 
 CVReturn DisplayLink::displayLinkCallback(CVDisplayLinkRef displayLinkRef, const CVTimeStamp*, const CVTimeStamp*, CVOptionFlags, CVOptionFlags*, void* data)
 {
-    WebPageProxy* webPageProxy = reinterpret_cast<WebPageProxy*>(data);
-    RunLoop::main().dispatch([weakPtr = makeWeakPtr(*webPageProxy)] {
-        if (auto* proxy = weakPtr.get())
-            proxy->process().send(Messages::DrawingArea::DisplayWasRefreshed(), proxy->pageID());
-    });
+    DisplayLink* displayLink = static_cast<DisplayLink*>(data);
+    displayLink->m_connection->send(Messages::DrawingArea::DisplayWasRefreshed(), displayLink->m_pageID);
     return kCVReturnSuccess;
 }
 
index 1541945..71bc86b 100644 (file)
 #include <WebCore/PlatformScreen.h>
 #include <wtf/HashSet.h>
 
+namespace IPC {
+class Connection;
+}
+
 namespace WebKit {
 
 class WebPageProxy;
@@ -53,6 +57,8 @@ private:
     
     CVDisplayLinkRef m_displayLink { nullptr };
     HashSet<unsigned> m_observers;
+    RefPtr<IPC::Connection> m_connection;
+    uint64_t m_pageID { 0 };
 };
 
 }