Clients sometimes block for 500ms in waitForPossibleGeometryUpdates
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 18 Apr 2015 01:04:24 +0000 (01:04 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 18 Apr 2015 01:04:24 +0000 (01:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=143901
<rdar://problem/20488655>

Reviewed by Anders Carlsson.

* Platform/IPC/Connection.cpp:
(IPC::Connection::waitForMessage):
InterruptWaitingIfSyncMessageArrives already cancels waitForMessage if
a sync message arrives while waiting, but it should also avoid waiting
if there's a sync message already in the queue when the waiting starts,
as that will have the same nasty effect.

* UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
(WebKit::TiledCoreAnimationDrawingAreaProxy::waitForPossibleGeometryUpdate):
If a synchronous message comes in from the Web process while we're waiting,
cancel our synchronous wait for DidUpdateGeometry. This will cause the size
change to not synchronize with the Web process' painting, but that is better
than pointlessly blocking for 500ms.

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

Source/WebKit2/ChangeLog
Source/WebKit2/Platform/IPC/Connection.cpp
Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm

index 8cc761a..50d67c1 100644 (file)
@@ -1,3 +1,25 @@
+2015-04-17  Tim Horton  <timothy_horton@apple.com>
+
+        Clients sometimes block for 500ms in waitForPossibleGeometryUpdates
+        https://bugs.webkit.org/show_bug.cgi?id=143901
+        <rdar://problem/20488655>
+
+        Reviewed by Anders Carlsson.
+
+        * Platform/IPC/Connection.cpp:
+        (IPC::Connection::waitForMessage):
+        InterruptWaitingIfSyncMessageArrives already cancels waitForMessage if
+        a sync message arrives while waiting, but it should also avoid waiting
+        if there's a sync message already in the queue when the waiting starts,
+        as that will have the same nasty effect.
+
+        * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
+        (WebKit::TiledCoreAnimationDrawingAreaProxy::waitForPossibleGeometryUpdate):
+        If a synchronous message comes in from the Web process while we're waiting,
+        cancel our synchronous wait for DidUpdateGeometry. This will cause the size
+        change to not synchronize with the Web process' painting, but that is better
+        than pointlessly blocking for 500ms.
+
 2015-04-17  Chris Dumez  <cdumez@apple.com>
 
         Possible null pointer dereference in WebDiagnosticLoggingClient::logDiagnosticMessageWithValue()
index 7197806..42e61a4 100644 (file)
@@ -418,6 +418,8 @@ std::unique_ptr<MessageDecoder> Connection::waitForMessage(StringReference messa
 {
     ASSERT(&m_clientRunLoop == &RunLoop::current());
 
+    bool hasIncomingSynchronousMessage = false;
+
     // First, check if this message is already in the incoming messages queue.
     {
         std::lock_guard<std::mutex> lock(m_incomingMessagesMutex);
@@ -431,9 +433,18 @@ std::unique_ptr<MessageDecoder> Connection::waitForMessage(StringReference messa
                 m_incomingMessages.remove(it);
                 return returnedMessage;
             }
+
+            if (message->isSyncMessage())
+                hasIncomingSynchronousMessage = true;
         }
     }
 
+    // Don't even start waiting if we have InterruptWaitingIfSyncMessageArrives and there's a sync message already in the queue.
+    if (hasIncomingSynchronousMessage && waitForMessageFlags & InterruptWaitingIfSyncMessageArrives) {
+        m_waitingForMessage = nullptr;
+        return nullptr;
+    }
+
     WaitForMessageState waitingForMessage(messageReceiverName, messageName, destinationID, waitForMessageFlags);
 
     {
@@ -444,7 +455,7 @@ std::unique_ptr<MessageDecoder> Connection::waitForMessage(StringReference messa
 
         m_waitingForMessage = &waitingForMessage;
     }
-    
+
     // Now wait for it to be set.
     while (true) {
         std::unique_lock<std::mutex> lock(m_waitForMessageMutex);
index bf20c73..6e37ad3 100644 (file)
@@ -76,7 +76,7 @@ void TiledCoreAnimationDrawingAreaProxy::waitForPossibleGeometryUpdate(std::chro
     if (m_webPageProxy.process().state() != WebProcessProxy::State::Running)
         return;
 
-    m_webPageProxy.process().connection()->waitForAndDispatchImmediately<Messages::DrawingAreaProxy::DidUpdateGeometry>(m_webPageProxy.pageID(), timeout);
+    m_webPageProxy.process().connection()->waitForAndDispatchImmediately<Messages::DrawingAreaProxy::DidUpdateGeometry>(m_webPageProxy.pageID(), timeout, InterruptWaitingIfSyncMessageArrives);
 }
 
 void TiledCoreAnimationDrawingAreaProxy::colorSpaceDidChange()