<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[182980] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/182980">182980</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2015-04-17 18:04:24 -0700 (Fri, 17 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Clients sometimes block for 500ms in waitForPossibleGeometryUpdates
https://bugs.webkit.org/show_bug.cgi?id=143901
&lt;rdar://problem/20488655&gt;

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.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCConnectioncpp">trunk/Source/WebKit2/Platform/IPC/Connection.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacTiledCoreAnimationDrawingAreaProxymm">trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (182979 => 182980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-18 00:46:30 UTC (rev 182979)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-18 01:04:24 UTC (rev 182980)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-04-17  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Clients sometimes block for 500ms in waitForPossibleGeometryUpdates
+        https://bugs.webkit.org/show_bug.cgi?id=143901
+        &lt;rdar://problem/20488655&gt;
+
+        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.
+
</ins><span class="cx"> 2015-04-17  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Possible null pointer dereference in WebDiagnosticLoggingClient::logDiagnosticMessageWithValue()
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/Connection.cpp (182979 => 182980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/Connection.cpp        2015-04-18 00:46:30 UTC (rev 182979)
+++ trunk/Source/WebKit2/Platform/IPC/Connection.cpp        2015-04-18 01:04:24 UTC (rev 182980)
</span><span class="lines">@@ -418,6 +418,8 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(&amp;m_clientRunLoop == &amp;RunLoop::current());
</span><span class="cx"> 
</span><ins>+    bool hasIncomingSynchronousMessage = false;
+
</ins><span class="cx">     // First, check if this message is already in the incoming messages queue.
</span><span class="cx">     {
</span><span class="cx">         std::lock_guard&lt;std::mutex&gt; lock(m_incomingMessagesMutex);
</span><span class="lines">@@ -431,9 +433,18 @@
</span><span class="cx">                 m_incomingMessages.remove(it);
</span><span class="cx">                 return returnedMessage;
</span><span class="cx">             }
</span><ins>+
+            if (message-&gt;isSyncMessage())
+                hasIncomingSynchronousMessage = true;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Don't even start waiting if we have InterruptWaitingIfSyncMessageArrives and there's a sync message already in the queue.
+    if (hasIncomingSynchronousMessage &amp;&amp; waitForMessageFlags &amp; InterruptWaitingIfSyncMessageArrives) {
+        m_waitingForMessage = nullptr;
+        return nullptr;
+    }
+
</ins><span class="cx">     WaitForMessageState waitingForMessage(messageReceiverName, messageName, destinationID, waitForMessageFlags);
</span><span class="cx"> 
</span><span class="cx">     {
</span><span class="lines">@@ -444,7 +455,7 @@
</span><span class="cx"> 
</span><span class="cx">         m_waitingForMessage = &amp;waitingForMessage;
</span><span class="cx">     }
</span><del>-    
</del><ins>+
</ins><span class="cx">     // Now wait for it to be set.
</span><span class="cx">     while (true) {
</span><span class="cx">         std::unique_lock&lt;std::mutex&gt; lock(m_waitForMessageMutex);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacTiledCoreAnimationDrawingAreaProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm (182979 => 182980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm        2015-04-18 00:46:30 UTC (rev 182979)
+++ trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm        2015-04-18 01:04:24 UTC (rev 182980)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">     if (m_webPageProxy.process().state() != WebProcessProxy::State::Running)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_webPageProxy.process().connection()-&gt;waitForAndDispatchImmediately&lt;Messages::DrawingAreaProxy::DidUpdateGeometry&gt;(m_webPageProxy.pageID(), timeout);
</del><ins>+    m_webPageProxy.process().connection()-&gt;waitForAndDispatchImmediately&lt;Messages::DrawingAreaProxy::DidUpdateGeometry&gt;(m_webPageProxy.pageID(), timeout, InterruptWaitingIfSyncMessageArrives);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TiledCoreAnimationDrawingAreaProxy::colorSpaceDidChange()
</span></span></pre>
</div>
</div>

</body>
</html>