<!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>[185824] 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/185824">185824</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2015-06-22 05:06:46 -0700 (Mon, 22 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2] ConnectionUnix should use FastMalloc to allocate on-heap resources
https://bugs.webkit.org/show_bug.cgi?id=146143

Reviewed by Carlos Garcia Campos.

IPC handling in Unix-specific IPC::Connection implementation should use
FastMalloc to allocate on-heap resources, instead of allocating via the
system allocator.

The AttachmentInfo class is marked as allocatable through FastMalloc.
That way it can be allocated through FastMalloc while still handled
through std::unique_ptr&lt;&gt;.

The char[] arrays in readBytesFromSocket() and Connection::sendOutgoingMessage()
are now handled through a MallocPtr&lt;&gt; object.

In Connection::sendOutgoingMessage(), both the AttachmentInfo[] and char[]
arrays are now only allocated if there are actual attachments contained
in the message. The code that's conditioned with a non-empty attachments
Vector is now also grouped together, in a single branch.

* Platform/IPC/unix/ConnectionUnix.cpp:
(IPC::readBytesFromSocket):
(IPC::Connection::sendOutgoingMessage):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCunixConnectionUnixcpp">trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (185823 => 185824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-06-22 11:55:45 UTC (rev 185823)
+++ trunk/Source/WebKit2/ChangeLog        2015-06-22 12:06:46 UTC (rev 185824)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2015-06-22  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [WK2] ConnectionUnix should use FastMalloc to allocate on-heap resources
+        https://bugs.webkit.org/show_bug.cgi?id=146143
+
+        Reviewed by Carlos Garcia Campos.
+
+        IPC handling in Unix-specific IPC::Connection implementation should use
+        FastMalloc to allocate on-heap resources, instead of allocating via the
+        system allocator.
+
+        The AttachmentInfo class is marked as allocatable through FastMalloc.
+        That way it can be allocated through FastMalloc while still handled
+        through std::unique_ptr&lt;&gt;.
+
+        The char[] arrays in readBytesFromSocket() and Connection::sendOutgoingMessage()
+        are now handled through a MallocPtr&lt;&gt; object.
+
+        In Connection::sendOutgoingMessage(), both the AttachmentInfo[] and char[]
+        arrays are now only allocated if there are actual attachments contained
+        in the message. The code that's conditioned with a non-empty attachments
+        Vector is now also grouped together, in a single branch.
+
+        * Platform/IPC/unix/ConnectionUnix.cpp:
+        (IPC::readBytesFromSocket):
+        (IPC::Connection::sendOutgoingMessage):
+
</ins><span class="cx"> 2015-06-22  Gyuyoung Kim  &lt;gyuyoung.kim@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL] test_ewk2_application_cache_manager has been failed since r185527
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCunixConnectionUnixcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp (185823 => 185824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp        2015-06-22 11:55:45 UTC (rev 185823)
+++ trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp        2015-06-22 12:06:46 UTC (rev 185824)
</span><span class="lines">@@ -94,6 +94,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class AttachmentInfo {
</span><ins>+    WTF_MAKE_FAST_ALLOCATED;
</ins><span class="cx"> public:
</span><span class="cx">     AttachmentInfo()
</span><span class="cx">         : m_type(Attachment::Uninitialized)
</span><span class="lines">@@ -274,8 +275,8 @@
</span><span class="cx">     memset(&amp;iov, 0, sizeof(iov));
</span><span class="cx"> 
</span><span class="cx">     message.msg_controllen = CMSG_SPACE(sizeof(int) * attachmentMaxAmount);
</span><del>-    auto attachmentDescriptorBuffer = std::make_unique&lt;char[]&gt;(message.msg_controllen);
-    memset(attachmentDescriptorBuffer.get(), 0, message.msg_controllen);
</del><ins>+    MallocPtr&lt;char&gt; attachmentDescriptorBuffer = MallocPtr&lt;char&gt;::malloc(sizeof(char) * message.msg_controllen);
+    memset(attachmentDescriptorBuffer.get(), 0, sizeof(char) * message.msg_controllen);
</ins><span class="cx">     message.msg_control = attachmentDescriptorBuffer.get();
</span><span class="cx"> 
</span><span class="cx">     iov[0].iov_base = buffer;
</span><span class="lines">@@ -438,21 +439,20 @@
</span><span class="cx">     iov[0].iov_base = reinterpret_cast&lt;void*&gt;(&amp;messageInfo);
</span><span class="cx">     iov[0].iov_len = sizeof(messageInfo);
</span><span class="cx"> 
</span><del>-    auto attachmentInfo = std::make_unique&lt;AttachmentInfo[]&gt;(attachments.size());
</del><ins>+    std::unique_ptr&lt;AttachmentInfo[]&gt; attachmentInfo;
+    MallocPtr&lt;char&gt; attachmentFDBuffer;
</ins><span class="cx"> 
</span><del>-    size_t attachmentFDBufferLength = 0;
</del><span class="cx">     if (!attachments.isEmpty()) {
</span><del>-        for (size_t i = 0; i &lt; attachments.size(); ++i) {
-            if (attachments[i].fileDescriptor() != -1)
-                attachmentFDBufferLength++;
-        }
-    }
-    auto attachmentFDBuffer = std::make_unique&lt;char[]&gt;(CMSG_SPACE(sizeof(int) * attachmentFDBufferLength));
-
-    if (!attachments.isEmpty()) {
</del><span class="cx">         int* fdPtr = 0;
</span><span class="cx"> 
</span><ins>+        size_t attachmentFDBufferLength = std::count_if(attachments.begin(), attachments.end(),
+            [](const Attachment&amp; attachment) {
+                return attachment.fileDescriptor() != -1;
+            });
+
</ins><span class="cx">         if (attachmentFDBufferLength) {
</span><ins>+            attachmentFDBuffer = MallocPtr&lt;char&gt;::malloc(sizeof(char) * CMSG_SPACE(sizeof(int) * attachmentFDBufferLength));
+
</ins><span class="cx">             message.msg_control = attachmentFDBuffer.get();
</span><span class="cx">             message.msg_controllen = CMSG_SPACE(sizeof(int) * attachmentFDBufferLength);
</span><span class="cx">             memset(message.msg_control, 0, message.msg_controllen);
</span><span class="lines">@@ -465,6 +465,7 @@
</span><span class="cx">             fdPtr = reinterpret_cast&lt;int*&gt;(CMSG_DATA(cmsg));
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        attachmentInfo = std::make_unique&lt;AttachmentInfo[]&gt;(attachments.size());
</ins><span class="cx">         int fdIndex = 0;
</span><span class="cx">         for (size_t i = 0; i &lt; attachments.size(); ++i) {
</span><span class="cx">             attachmentInfo[i].setType(attachments[i].type());
</span></span></pre>
</div>
</div>

</body>
</html>