<!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>[201518] trunk/Source</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/201518">201518</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-05-31 12:33:22 -0700 (Tue, 31 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make createCrossThreadTask() functions return on the stack instead of the heap.
https://bugs.webkit.org/show_bug.cgi?id=158215

Reviewed by Darin Adler.

Source/WebCore:

No new tests (Refactor, no change in behavior).

* Modules/indexeddb/client/IDBConnectionProxy.h:

* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::postDatabaseTask):
(WebCore::IDBServer::IDBServer::postDatabaseTaskReply):
(WebCore::IDBServer::IDBServer::databaseRunLoop):
* Modules/indexeddb/server/IDBServer.h:

* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTask):
(WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTaskReply):
* Modules/indexeddb/server/UniqueIDBDatabase.h:

* dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::postCrossThreadTask):

* fileapi/ThreadableBlobRegistry.cpp:
(WebCore::threadableQueue):

Source/WebKit2:

* DatabaseProcess/DatabaseProcess.cpp:
(WebKit::DatabaseProcess::postDatabaseTask):
(WebKit::DatabaseProcess::performNextDatabaseTask):
(WebKit::DatabaseProcess::fetchWebsiteData):
* DatabaseProcess/DatabaseProcess.h:

Source/WTF:

* WTF.xcodeproj/project.pbxproj:

* wtf/CrossThreadCopier.cpp:

* wtf/CrossThreadQueue.h: Added. A lightweight of MessageQueue that deals directly
  in objects instead of in std::unique_ptrs.
(WTF::CrossThreadQueue::isKilled):
(WTF::CrossThreadQueue&lt;DataType&gt;::append):
(WTF::CrossThreadQueue&lt;DataType&gt;::waitForMessage):
(WTF::CrossThreadQueue&lt;DataType&gt;::tryGetMessage):

* wtf/CrossThreadTask.h:
(WTF::createCrossThreadTask):
(WTF::CrossThreadTask::CrossThreadTask): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFWTFxcodeprojprojectpbxproj">trunk/Source/WTF/WTF.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWTFwtfCrossThreadCopiercpp">trunk/Source/WTF/wtf/CrossThreadCopier.cpp</a></li>
<li><a href="#trunkSourceWTFwtfCrossThreadTaskh">trunk/Source/WTF/wtf/CrossThreadTask.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionProxyh">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBServercpp">trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBServerh">trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseh">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h</a></li>
<li><a href="#trunkSourceWebCoredomScriptExecutionContexth">trunk/Source/WebCore/dom/ScriptExecutionContext.h</a></li>
<li><a href="#trunkSourceWebCorefileapiThreadableBlobRegistrycpp">trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessDatabaseProcesscpp">trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessDatabaseProcessh">trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWTFwtfCrossThreadQueueh">trunk/Source/WTF/wtf/CrossThreadQueue.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WTF/ChangeLog        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2016-05-31  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Make createCrossThreadTask() functions return on the stack instead of the heap.
+        https://bugs.webkit.org/show_bug.cgi?id=158215
+
+        Reviewed by Darin Adler.
+
+        * WTF.xcodeproj/project.pbxproj:
+
+        * wtf/CrossThreadCopier.cpp:
+
+        * wtf/CrossThreadQueue.h: Added. A lightweight of MessageQueue that deals directly
+          in objects instead of in std::unique_ptrs.
+        (WTF::CrossThreadQueue::isKilled):
+        (WTF::CrossThreadQueue&lt;DataType&gt;::append):
+        (WTF::CrossThreadQueue&lt;DataType&gt;::waitForMessage):
+        (WTF::CrossThreadQueue&lt;DataType&gt;::tryGetMessage):
+
+        * wtf/CrossThreadTask.h:
+        (WTF::createCrossThreadTask):
+        (WTF::CrossThreadTask::CrossThreadTask): Deleted.
+
</ins><span class="cx"> 2016-05-30  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Move CrossThreadCopier/CrossThreadTask to WTF.
</span></span></pre></div>
<a id="trunkSourceWTFWTFxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.xcodeproj/project.pbxproj (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -104,6 +104,7 @@
</span><span class="cx">                 515F794E1CFC9F4A00CCED93 /* CrossThreadCopier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 515F794B1CFC9F4A00CCED93 /* CrossThreadCopier.cpp */; };
</span><span class="cx">                 515F794F1CFC9F4A00CCED93 /* CrossThreadCopier.h in Headers */ = {isa = PBXBuildFile; fileRef = 515F794C1CFC9F4A00CCED93 /* CrossThreadCopier.h */; };
</span><span class="cx">                 515F79501CFC9F4A00CCED93 /* CrossThreadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 515F794D1CFC9F4A00CCED93 /* CrossThreadTask.h */; };
</span><ins>+                515F79561CFD3A6900CCED93 /* CrossThreadQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 515F79551CFD3A6900CCED93 /* CrossThreadQueue.h */; };
</ins><span class="cx">                 553071CA1C40427200384898 /* TinyLRUCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 553071C91C40427200384898 /* TinyLRUCache.h */; };
</span><span class="cx">                 70A993FE1AD7151300FA615B /* SymbolRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70A993FC1AD7151300FA615B /* SymbolRegistry.cpp */; };
</span><span class="cx">                 70A993FF1AD7151300FA615B /* SymbolRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 70A993FD1AD7151300FA615B /* SymbolRegistry.h */; };
</span><span class="lines">@@ -426,6 +427,7 @@
</span><span class="cx">                 515F794B1CFC9F4A00CCED93 /* CrossThreadCopier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CrossThreadCopier.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 515F794C1CFC9F4A00CCED93 /* CrossThreadCopier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrossThreadCopier.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 515F794D1CFC9F4A00CCED93 /* CrossThreadTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrossThreadTask.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                515F79551CFD3A6900CCED93 /* CrossThreadQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrossThreadQueue.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 553071C91C40427200384898 /* TinyLRUCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TinyLRUCache.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5D247B6214689B8600E78B76 /* libWTF.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libWTF.a; sourceTree = BUILT_PRODUCTS_DIR; };
</span><span class="cx">                 5D247B6E14689C4700E78B76 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -805,6 +807,7 @@
</span><span class="cx">                                 0FDB698D1B7C643A000C1078 /* Condition.h */,
</span><span class="cx">                                 515F794B1CFC9F4A00CCED93 /* CrossThreadCopier.cpp */,
</span><span class="cx">                                 515F794C1CFC9F4A00CCED93 /* CrossThreadCopier.h */,
</span><ins>+                                515F79551CFD3A6900CCED93 /* CrossThreadQueue.h */,
</ins><span class="cx">                                 515F794D1CFC9F4A00CCED93 /* CrossThreadTask.h */,
</span><span class="cx">                                 A8A47273151A825A004123FF /* CryptographicallyRandomNumber.cpp */,
</span><span class="cx">                                 A8A47274151A825A004123FF /* CryptographicallyRandomNumber.h */,
</span><span class="lines">@@ -1182,6 +1185,7 @@
</span><span class="cx">                                 A8A47452151A825B004123FF /* BinarySemaphore.h in Headers */,
</span><span class="cx">                                 A8A4738A151A825B004123FF /* Bitmap.h in Headers */,
</span><span class="cx">                                 A8A4738C151A825B004123FF /* BitVector.h in Headers */,
</span><ins>+                                515F79561CFD3A6900CCED93 /* CrossThreadQueue.h in Headers */,
</ins><span class="cx">                                 1A944F471C3D8814005BD28C /* BlockPtr.h in Headers */,
</span><span class="cx">                                 93DDE9321CDC052D00FD3491 /* dyldSPI.h in Headers */,
</span><span class="cx">                                 A8A4738E151A825B004123FF /* BlockStack.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWTFwtfCrossThreadCopiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/CrossThreadCopier.cpp (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/CrossThreadCopier.cpp        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WTF/wtf/CrossThreadCopier.cpp        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -30,8 +30,10 @@
</span><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><del>-#include &quot;CrossThreadCopier.h&quot;
</del><ins>+#include &lt;wtf/CrossThreadCopier.h&gt;
</ins><span class="cx"> 
</span><ins>+#include &lt;wtf/CrossThreadTask.h&gt;
+
</ins><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><span class="cx"> // Test CrossThreadCopier using COMPILE_ASSERT.
</span><span class="lines">@@ -78,3 +80,4 @@
</span><span class="cx"> static_assert((std::is_same&lt;int, CrossThreadCopier&lt;CopierRefCountedTest*&gt;::Type&gt;::value), &quot;CrossThreadCopier specialization improperly applied to raw pointer of a RefCounted (but not ThreadSafeRefCounted) type&quot;);
</span><span class="cx"> 
</span><span class="cx"> } // namespace WTF
</span><ins>+
</ins></span></pre></div>
<a id="trunkSourceWTFwtfCrossThreadQueueh"></a>
<div class="addfile"><h4>Added: trunk/Source/WTF/wtf/CrossThreadQueue.h (0 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/CrossThreadQueue.h                                (rev 0)
+++ trunk/Source/WTF/wtf/CrossThreadQueue.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -0,0 +1,97 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &lt;limits&gt;
+#include &lt;wtf/Assertions.h&gt;
+#include &lt;wtf/Condition.h&gt;
+#include &lt;wtf/Deque.h&gt;
+#include &lt;wtf/Lock.h&gt;
+#include &lt;wtf/Noncopyable.h&gt;
+#include &lt;wtf/Optional.h&gt;
+#include &lt;wtf/Threading.h&gt;
+
+namespace WTF {
+
+template&lt;typename DataType&gt;
+class CrossThreadQueue {
+    WTF_MAKE_NONCOPYABLE(CrossThreadQueue);
+public:
+    CrossThreadQueue() = default;
+
+    void append(DataType&amp;&amp;);
+
+    DataType waitForMessage();
+    Optional&lt;DataType&gt; tryGetMessage();
+
+    bool isKilled() const { return false; }
+
+private:
+    mutable Lock m_lock;
+    Condition m_condition;
+    Deque&lt;DataType&gt; m_queue;
+};
+
+template&lt;typename DataType&gt;
+void CrossThreadQueue&lt;DataType&gt;::append(DataType&amp;&amp; message)
+{
+    LockHolder lock(m_lock);
+    m_queue.append(WTFMove(message));
+    m_condition.notifyOne();
+}
+
+template&lt;typename DataType&gt;
+DataType CrossThreadQueue&lt;DataType&gt;::waitForMessage()
+{
+    LockHolder lock(m_lock);
+
+    auto found = m_queue.end();
+    while (found == m_queue.end()) {
+        found = m_queue.begin();
+        if (found != m_queue.end())
+            break;
+
+        static const double infiniteTime = std::numeric_limits&lt;double&gt;::max();
+        m_condition.waitUntilWallClockSeconds(m_lock, infiniteTime);
+    }
+
+    return m_queue.takeFirst();
+}
+
+template&lt;typename DataType&gt;
+Optional&lt;DataType&gt; CrossThreadQueue&lt;DataType&gt;::tryGetMessage()
+{
+    LockHolder lock(m_lock);
+
+    if (m_queue.isEmpty())
+        return { };
+
+    return m_queue.takeFirst();
+}
+
+} // namespace WTF
+
+using WTF::CrossThreadQueue;
</ins></span></pre></div>
<a id="trunkSourceWTFwtfCrossThreadTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/CrossThreadTask.h (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/CrossThreadTask.h        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WTF/wtf/CrossThreadTask.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -27,12 +27,14 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/CrossThreadCopier.h&gt;
</span><span class="cx"> #include &lt;wtf/NoncopyableFunction.h&gt;
</span><ins>+#include &lt;wtf/StdLibExtras.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><span class="cx"> class CrossThreadTask {
</span><del>-    WTF_MAKE_NONCOPYABLE(CrossThreadTask);
</del><span class="cx"> public:
</span><ins>+    CrossThreadTask() = default;
+
</ins><span class="cx">     CrossThreadTask(NoncopyableFunction&lt;void ()&gt;&amp;&amp; taskFunction)
</span><span class="cx">         : m_taskFunction(WTFMove(taskFunction))
</span><span class="cx">     {
</span><span class="lines">@@ -45,8 +47,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    CrossThreadTask() { }
-
</del><span class="cx">     NoncopyableFunction&lt;void ()&gt; m_taskFunction;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -73,33 +73,33 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)())
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T&gt;&gt;(&amp;callee, method);
</del><ins>+    return CrossThreadTaskImpl&lt;T&gt;(&amp;callee, method);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1),
</span><span class="cx">     const P1&amp; parameter1)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="cx">     const P2&amp; parameter2)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="lines">@@ -108,14 +108,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2, MP3),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="cx">     const P2&amp; parameter2,
</span><span class="cx">     const P3&amp; parameter3)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2, MP3&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2, MP3&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="lines">@@ -124,13 +124,13 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     void (*method)(MP1, MP2, MP3),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="cx">     const P2&amp; parameter2,
</span><span class="cx">     const P3&amp; parameter3)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskStaticImpl&lt;MP1, MP2, MP3&gt;&gt;(
</del><ins>+    return CrossThreadTaskStaticImpl&lt;MP1, MP2, MP3&gt;(
</ins><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="cx">         WTF::CrossThreadCopier&lt;P2&gt;::copy(parameter2),
</span><span class="lines">@@ -138,7 +138,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2, MP3, MP4),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="lines">@@ -146,7 +146,7 @@
</span><span class="cx">     const P3&amp; parameter3,
</span><span class="cx">     const P4&amp; parameter4)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="lines">@@ -156,7 +156,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2, MP3, MP4, MP5),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="lines">@@ -165,7 +165,7 @@
</span><span class="cx">     const P4&amp; parameter4,
</span><span class="cx">     const P5&amp; parameter5)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="lines">@@ -176,7 +176,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="lines">@@ -186,7 +186,7 @@
</span><span class="cx">     const P5&amp; parameter5,
</span><span class="cx">     const P6&amp; parameter6)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="lines">@@ -198,7 +198,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6, MP7),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="lines">@@ -209,7 +209,7 @@
</span><span class="cx">     const P6&amp; parameter6,
</span><span class="cx">     const P7&amp; parameter7)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6, MP7&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6, MP7&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span><span class="lines">@@ -222,7 +222,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8&gt;
</span><del>-std::unique_ptr&lt;CrossThreadTask&gt; createCrossThreadTask(
</del><ins>+CrossThreadTask createCrossThreadTask(
</ins><span class="cx">     T&amp; callee,
</span><span class="cx">     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
</span><span class="cx">     const P1&amp; parameter1,
</span><span class="lines">@@ -234,7 +234,7 @@
</span><span class="cx">     const P7&amp; parameter7,
</span><span class="cx">     const P8&amp; parameter8)
</span><span class="cx"> {
</span><del>-    return std::make_unique&lt;CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8&gt;&gt;(
</del><ins>+    return CrossThreadTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8&gt;(
</ins><span class="cx">         &amp;callee,
</span><span class="cx">         method,
</span><span class="cx">         WTF::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/ChangeLog        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-05-31  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Make createCrossThreadTask() functions return on the stack instead of the heap.
+        https://bugs.webkit.org/show_bug.cgi?id=158215
+
+        Reviewed by Darin Adler.
+
+        No new tests (Refactor, no change in behavior).
+
+        * Modules/indexeddb/client/IDBConnectionProxy.h:
+        
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::postDatabaseTask):
+        (WebCore::IDBServer::IDBServer::postDatabaseTaskReply):
+        (WebCore::IDBServer::IDBServer::databaseRunLoop):
+        * Modules/indexeddb/server/IDBServer.h:
+        
+        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTask):
+        (WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTaskReply):
+        * Modules/indexeddb/server/UniqueIDBDatabase.h:
+        
+        * dom/ScriptExecutionContext.h:
+        (WebCore::ScriptExecutionContext::postCrossThreadTask):
+        
+        * fileapi/ThreadableBlobRegistry.cpp:
+        (WebCore::threadableQueue):
+
</ins><span class="cx"> 2016-05-31  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r189567): Elements with aspect ratios not handled correctly inside flexbox.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;IDBResourceIdentifier.h&quot;
</span><span class="cx"> #include &quot;TransactionOperation.h&quot;
</span><span class="cx"> #include &lt;functional&gt;
</span><ins>+#include &lt;wtf/CrossThreadQueue.h&gt;
</ins><span class="cx"> #include &lt;wtf/CrossThreadTask.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="lines">@@ -157,7 +158,7 @@
</span><span class="cx">     HashMap&lt;IDBResourceIdentifier, RefPtr&lt;TransactionOperation&gt;&gt; m_activeOperations;
</span><span class="cx">     Lock m_transactionOperationLock;
</span><span class="cx"> 
</span><del>-    MessageQueue&lt;CrossThreadTask&gt; m_mainThreadQueue;
</del><ins>+    CrossThreadQueue&lt;CrossThreadTask&gt; m_mainThreadQueue;
</ins><span class="cx">     Lock m_mainThreadTaskLock;
</span><span class="cx">     RefPtr&lt;IDBConnectionToServer&gt; m_mainThreadProtector;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -431,13 +431,13 @@
</span><span class="cx">     connection-&gt;didGetAllDatabaseNames(callbackID, databaseNames);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBServer::postDatabaseTask(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp; task)
</del><ins>+void IDBServer::postDatabaseTask(CrossThreadTask&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     m_databaseQueue.append(WTFMove(task));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBServer::postDatabaseTaskReply(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp; task)
</del><ins>+void IDBServer::postDatabaseTaskReply(CrossThreadTask&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     m_databaseReplyQueue.append(WTFMove(task));
</span><span class="lines">@@ -467,8 +467,8 @@
</span><span class="cx">         Locker&lt;Lock&gt; locker(m_databaseThreadCreationLock);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    while (auto task = m_databaseQueue.waitForMessage())
-        task-&gt;performTask();
</del><ins>+    while (!m_databaseQueue.isKilled())
+        m_databaseQueue.waitForMessage().performTask();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBServer::handleTaskRepliesOnMainThread()
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;IDBDatabaseIdentifier.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabase.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseConnection.h&quot;
</span><ins>+#include &lt;wtf/CrossThreadQueue.h&gt;
</ins><span class="cx"> #include &lt;wtf/CrossThreadTask.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="lines">@@ -84,8 +85,8 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void getAllDatabaseNames(uint64_t serverConnectionIdentifier, const SecurityOriginData&amp; mainFrameOrigin, const SecurityOriginData&amp; openingOrigin, uint64_t callbackID);
</span><span class="cx"> 
</span><del>-    void postDatabaseTask(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp;);
-    void postDatabaseTaskReply(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp;);
</del><ins>+    void postDatabaseTask(CrossThreadTask&amp;&amp;);
+    void postDatabaseTaskReply(CrossThreadTask&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void registerDatabaseConnection(UniqueIDBDatabaseConnection&amp;);
</span><span class="cx">     void unregisterDatabaseConnection(UniqueIDBDatabaseConnection&amp;);
</span><span class="lines">@@ -124,8 +125,8 @@
</span><span class="cx">     Lock m_mainThreadReplyLock;
</span><span class="cx">     bool m_mainThreadReplyScheduled { false };
</span><span class="cx"> 
</span><del>-    MessageQueue&lt;CrossThreadTask&gt; m_databaseQueue;
-    MessageQueue&lt;CrossThreadTask&gt; m_databaseReplyQueue;
</del><ins>+    CrossThreadQueue&lt;CrossThreadTask&gt; m_databaseQueue;
+    CrossThreadQueue&lt;CrossThreadTask&gt; m_databaseReplyQueue;
</ins><span class="cx"> 
</span><span class="cx">     HashMap&lt;uint64_t, UniqueIDBDatabaseConnection*&gt; m_databaseConnections;
</span><span class="cx">     HashMap&lt;IDBResourceIdentifier, UniqueIDBDatabaseTransaction*&gt; m_transactions;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -1505,7 +1505,7 @@
</span><span class="cx">         invokeOperationAndTransactionTimer();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UniqueIDBDatabase::postDatabaseTask(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp; task)
</del><ins>+void UniqueIDBDatabase::postDatabaseTask(CrossThreadTask&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     m_databaseQueue.append(WTFMove(task));
</span><span class="lines">@@ -1514,7 +1514,7 @@
</span><span class="cx">     m_server.postDatabaseTask(createCrossThreadTask(*this, &amp;UniqueIDBDatabase::executeNextDatabaseTask));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UniqueIDBDatabase::postDatabaseTaskReply(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp; task)
</del><ins>+void UniqueIDBDatabase::postDatabaseTaskReply(CrossThreadTask&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     m_databaseReplyQueue.append(WTFMove(task));
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;Timer.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseConnection.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseTransaction.h&quot;
</span><ins>+#include &lt;wtf/CrossThreadQueue.h&gt;
</ins><span class="cx"> #include &lt;wtf/CrossThreadTask.h&gt;
</span><span class="cx"> #include &lt;wtf/Deque.h&gt;
</span><span class="cx"> #include &lt;wtf/HashCountedSet.h&gt;
</span><span class="lines">@@ -195,8 +196,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool prepareToFinishTransaction(UniqueIDBDatabaseTransaction&amp;);
</span><span class="cx"> 
</span><del>-    void postDatabaseTask(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp;);
-    void postDatabaseTaskReply(std::unique_ptr&lt;CrossThreadTask&gt;&amp;&amp;);
</del><ins>+    void postDatabaseTask(CrossThreadTask&amp;&amp;);
+    void postDatabaseTaskReply(CrossThreadTask&amp;&amp;);
</ins><span class="cx">     void executeNextDatabaseTask();
</span><span class="cx">     void executeNextDatabaseTaskReply();
</span><span class="cx"> 
</span><span class="lines">@@ -242,8 +243,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool m_deleteBackingStoreInProgress { false };
</span><span class="cx"> 
</span><del>-    MessageQueue&lt;CrossThreadTask&gt; m_databaseQueue;
-    MessageQueue&lt;CrossThreadTask&gt; m_databaseReplyQueue;
</del><ins>+    CrossThreadQueue&lt;CrossThreadTask&gt; m_databaseQueue;
+    CrossThreadQueue&lt;CrossThreadTask&gt; m_databaseReplyQueue;
</ins><span class="cx">     std::atomic&lt;uint64_t&gt; m_queuedTaskCount { 0 };
</span><span class="cx"> 
</span><span class="cx">     bool m_hardClosedForUserDelete { false };
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptExecutionContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptExecutionContext.h        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -172,11 +172,8 @@
</span><span class="cx">     template&lt;typename... Arguments&gt;
</span><span class="cx">     void postCrossThreadTask(Arguments&amp;&amp;... arguments)
</span><span class="cx">     {
</span><del>-        auto crossThreadTask = createCrossThreadTask(arguments...);
-        auto* rawTask = crossThreadTask.release();
-        postTask([=](ScriptExecutionContext&amp;) {
-            std::unique_ptr&lt;CrossThreadTask&gt; task(rawTask);
-            task-&gt;performTask();
</del><ins>+        postTask([crossThreadTask = createCrossThreadTask(arguments...)](ScriptExecutionContext&amp;) mutable {
+            crossThreadTask.performTask();
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiThreadableBlobRegistrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;BlobURL.h&quot;
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> #include &lt;mutex&gt;
</span><ins>+#include &lt;wtf/CrossThreadQueue.h&gt;
</ins><span class="cx"> #include &lt;wtf/CrossThreadTask.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="lines">@@ -100,12 +101,12 @@
</span><span class="cx">     return *map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static MessageQueue&lt;CrossThreadTask&gt;&amp; threadableQueue()
</del><ins>+static CrossThreadQueue&lt;CrossThreadTask&gt;&amp; threadableQueue()
</ins><span class="cx"> {
</span><span class="cx">     static std::once_flag onceFlag;
</span><del>-    static MessageQueue&lt;CrossThreadTask&gt;* queue;
</del><ins>+    static CrossThreadQueue&lt;CrossThreadTask&gt;* queue;
</ins><span class="cx">     std::call_once(onceFlag, [] {
</span><del>-        queue = new MessageQueue&lt;CrossThreadTask&gt;;
</del><ins>+        queue = new CrossThreadQueue&lt;CrossThreadTask&gt;;
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     return *queue;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebKit2/ChangeLog        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-05-31  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Make createCrossThreadTask() functions return on the stack instead of the heap.
+        https://bugs.webkit.org/show_bug.cgi?id=158215
+
+        Reviewed by Darin Adler.
+
+        * DatabaseProcess/DatabaseProcess.cpp:
+        (WebKit::DatabaseProcess::postDatabaseTask):
+        (WebKit::DatabaseProcess::performNextDatabaseTask):
+        (WebKit::DatabaseProcess::fetchWebsiteData):
+        * DatabaseProcess/DatabaseProcess.h:
+
</ins><span class="cx"> 2016-05-31  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. Update OptionsGTK.cmake and NEWS for 2.13.1 release.
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessDatabaseProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -143,7 +143,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void DatabaseProcess::postDatabaseTask(std::unique_ptr&lt;CrossThreadTask&gt; task)
</del><ins>+void DatabaseProcess::postDatabaseTask(CrossThreadTask&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="cx"> 
</span><span class="lines">@@ -160,14 +160,14 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!RunLoop::isMain());
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;CrossThreadTask&gt; task;
</del><ins>+    CrossThreadTask task;
</ins><span class="cx">     {
</span><span class="cx">         LockHolder locker(m_databaseTaskMutex);
</span><span class="cx">         ASSERT(!m_databaseTasks.isEmpty());
</span><span class="cx">         task = m_databaseTasks.takeFirst();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    task-&gt;performTask();
</del><ins>+    task.performTask();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DatabaseProcess::createDatabaseToWebProcessConnection()
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">     if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
</span><span class="cx">         // FIXME: Pick the right database store based on the session ID.
</span><del>-        postDatabaseTask(std::make_unique&lt;CrossThreadTask&gt;([callbackAggregator, websiteDataTypes, this] {
</del><ins>+        postDatabaseTask(CrossThreadTask([callbackAggregator, websiteDataTypes, this] {
</ins><span class="cx"> 
</span><span class="cx">             Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt; securityOrigins = indexedDatabaseOrigins();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessDatabaseProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h (201517 => 201518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h        2016-05-31 18:49:52 UTC (rev 201517)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h        2016-05-31 19:33:22 UTC (rev 201518)
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx"> 
</span><span class="cx">     WorkQueue&amp; queue() { return m_queue.get(); }
</span><span class="cx"> 
</span><del>-    void postDatabaseTask(std::unique_ptr&lt;CrossThreadTask&gt;);
</del><ins>+    void postDatabaseTask(CrossThreadTask&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">     // WebCore::IDBServer::IDBBackingStoreFileHandler
</span><span class="lines">@@ -126,7 +126,7 @@
</span><span class="cx">     HashMap&lt;String, RefPtr&lt;SandboxExtension&gt;&gt; m_blobTemporaryFileSandboxExtensions;
</span><span class="cx">     HashMap&lt;uint64_t, std::function&lt;void (const SandboxExtension::HandleArray&amp;)&gt;&gt; m_sandboxExtensionForBlobsCompletionHandlers;
</span><span class="cx"> 
</span><del>-    Deque&lt;std::unique_ptr&lt;CrossThreadTask&gt;&gt; m_databaseTasks;
</del><ins>+    Deque&lt;CrossThreadTask&gt; m_databaseTasks;
</ins><span class="cx">     Lock m_databaseTaskMutex;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>