<!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>[201809] trunk</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/201809">201809</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-06-08 10:31:47 -0700 (Wed, 08 Jun 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Make CrossThreadCopier more efficient (fewer copies!).
https://bugs.webkit.org/show_bug.cgi?id=158456
Reviewed by Alex Christensen.
Source/WTF:
Previously, we'd run all arguments through CrossThreadCopier, then immediately make
an unnecessary copy of the result during lambda capture.
Instead, we should just put the CrossThreadCopier generated objects directly in lambdas,
which are then captured by NoncopyableFunctions.
This reduces the number of constructor calls per argument from 2 copies to 1 move.
* wtf/CrossThreadTask.h:
(WTF::CrossThreadTask::CrossThreadTask):
(WTF::createCrossThreadTask):
Tools:
* TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp:
(TestWebKitAPI::TEST):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfCrossThreadTaskh">trunk/Source/WTF/wtf/CrossThreadTask.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFCrossThreadTaskcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (201808 => 201809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-06-08 17:31:12 UTC (rev 201808)
+++ trunk/Source/WTF/ChangeLog        2016-06-08 17:31:47 UTC (rev 201809)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-06-08 Brady Eidson <beidson@apple.com>
+
+ Make CrossThreadCopier more efficient (fewer copies!).
+ https://bugs.webkit.org/show_bug.cgi?id=158456
+
+ Reviewed by Alex Christensen.
+
+ Previously, we'd run all arguments through CrossThreadCopier, then immediately make
+ an unnecessary copy of the result during lambda capture.
+
+ Instead, we should just put the CrossThreadCopier generated objects directly in lambdas,
+ which are then captured by NoncopyableFunctions.
+
+ This reduces the number of constructor calls per argument from 2 copies to 1 move.
+
+ * wtf/CrossThreadTask.h:
+ (WTF::CrossThreadTask::CrossThreadTask):
+ (WTF::createCrossThreadTask):
+
</ins><span class="cx"> 2016-06-07 Filip Pizlo <fpizlo@apple.com>
</span><span class="cx">
</span><span class="cx"> Implement Air::allocateStack() in ES6 to see how much of a bad idea that is
</span></span></pre></div>
<a id="trunkSourceWTFwtfCrossThreadTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/CrossThreadTask.h (201808 => 201809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/CrossThreadTask.h        2016-06-08 17:31:12 UTC (rev 201808)
+++ trunk/Source/WTF/wtf/CrossThreadTask.h        2016-06-08 17:31:47 UTC (rev 201809)
</span><span class="lines">@@ -32,13 +32,31 @@
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><span class="cx"> class CrossThreadTask {
</span><ins>+ template<class T>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)());
+ template<class T, class P1, class MP1>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1), const P1&);
+ template<class T, class P1, class MP1, class P2, class MP2>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2), const P1&, const P2&);
+ template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3), const P1&, const P2&, const P3&);
+ template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4), const P1&, const P2&, const P3&, const P4&);
+ template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5), const P1&, const P2&, const P3&, const P4&, const P5&);
+ template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5, class P6, class MP6>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5, MP6), const P1&, const P2&, const P3&, const P4&, const P5&, const P6&);
+ template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5, class P6, class MP6, class P7, class MP7>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5, MP6, MP7), const P1&, const P2&, const P3&, const P4&, const P5&, const P6&, const P7&);
+ template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5, class P6, class MP6, class P7, class MP7, class P8, class MP8>
+ friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8), const P1&, const P2&, const P3&, const P4&, const P5&, const P6&, const P7&, const P8&);
</ins><span class="cx"> public:
</span><span class="cx"> CrossThreadTask() = default;
</span><span class="cx">
</span><span class="cx"> CrossThreadTask(NoncopyableFunction<void ()>&& taskFunction)
</span><span class="cx"> : m_taskFunction(WTFMove(taskFunction))
</span><span class="cx"> {
</span><del>- ASSERT(taskFunction);
</del><ins>+ ASSERT(m_taskFunction);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void performTask()
</span><span class="lines">@@ -50,34 +68,14 @@
</span><span class="cx"> NoncopyableFunction<void ()> m_taskFunction;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-template <typename T, typename... Arguments>
-class CrossThreadTaskImpl final : public CrossThreadTask {
-public:
- CrossThreadTaskImpl(T* callee, void (T::*method)(Arguments...), Arguments&&... arguments)
- {
- m_taskFunction = [callee, method, arguments...] {
- (callee->*method)(arguments...);
- };
- }
-};
-
-template <typename... Arguments>
-class CrossThreadTaskStaticImpl final : public CrossThreadTask {
-public:
- CrossThreadTaskStaticImpl(void (*method)(Arguments...), Arguments&&... arguments)
- {
- m_taskFunction = [method, arguments...] {
- method(arguments...);
- };
- }
-};
-
</del><span class="cx"> template<typename T>
</span><span class="cx"> CrossThreadTask createCrossThreadTask(
</span><span class="cx"> T& callee,
</span><span class="cx"> void (T::*method)())
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T>(&callee, method);
</del><ins>+ return CrossThreadTask([callee = &callee, method]() mutable {
+ (callee->*method)();
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename P1, typename MP1>
</span><span class="lines">@@ -86,10 +84,10 @@
</span><span class="cx"> void (T::*method)(MP1),
</span><span class="cx"> const P1& parameter1)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1)]() mutable {
+ (callee->*method)(p1);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename P1, typename MP1, typename P2, typename MP2>
</span><span class="lines">@@ -99,12 +97,11 @@
</span><span class="cx"> const P1& parameter1,
</span><span class="cx"> const P2& parameter2)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2));
-
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2)]() mutable {
+ (callee->*method)(p1, p2);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
</span><span class="lines">@@ -115,12 +112,12 @@
</span><span class="cx"> const P2& parameter2,
</span><span class="cx"> const P3& parameter3)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2, MP3>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3)]() mutable {
+ (callee->*method)(p1, p2, p3);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
</span><span class="lines">@@ -130,11 +127,12 @@
</span><span class="cx"> const P2& parameter2,
</span><span class="cx"> const P3& parameter3)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskStaticImpl<MP1, MP2, MP3>(
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3));
</del><ins>+ return CrossThreadTask([method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3)]() mutable {
+ method(p1, p2, p3);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
</span><span class="lines">@@ -146,13 +144,13 @@
</span><span class="cx"> const P3& parameter3,
</span><span class="cx"> const P4& parameter4)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2, MP3, MP4>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3),
- WTF::CrossThreadCopier<P4>::copy(parameter4));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3),
+ p4 = CrossThreadCopier<P4>::copy(parameter4)]() mutable {
+ (callee->*method)(p1, p2, p3, p4);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5>
</span><span class="lines">@@ -165,14 +163,14 @@
</span><span class="cx"> const P4& parameter4,
</span><span class="cx"> const P5& parameter5)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2, MP3, MP4, MP5>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3),
- WTF::CrossThreadCopier<P4>::copy(parameter4),
- WTF::CrossThreadCopier<P5>::copy(parameter5));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3),
+ p4 = CrossThreadCopier<P4>::copy(parameter4),
+ p5 = CrossThreadCopier<P5>::copy(parameter5)]() mutable {
+ (callee->*method)(p1, p2, p3, p4, p5);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<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>
</span><span class="lines">@@ -186,15 +184,15 @@
</span><span class="cx"> const P5& parameter5,
</span><span class="cx"> const P6& parameter6)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2, MP3, MP4, MP5, MP6>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3),
- WTF::CrossThreadCopier<P4>::copy(parameter4),
- WTF::CrossThreadCopier<P5>::copy(parameter5),
- WTF::CrossThreadCopier<P6>::copy(parameter6));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3),
+ p4 = CrossThreadCopier<P4>::copy(parameter4),
+ p5 = CrossThreadCopier<P5>::copy(parameter5),
+ p6 = CrossThreadCopier<P6>::copy(parameter6)]() mutable {
+ (callee->*method)(p1, p2, p3, p4, p5, p6);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<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>
</span><span class="lines">@@ -209,16 +207,16 @@
</span><span class="cx"> const P6& parameter6,
</span><span class="cx"> const P7& parameter7)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2, MP3, MP4, MP5, MP6, MP7>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3),
- WTF::CrossThreadCopier<P4>::copy(parameter4),
- WTF::CrossThreadCopier<P5>::copy(parameter5),
- WTF::CrossThreadCopier<P6>::copy(parameter6),
- WTF::CrossThreadCopier<P7>::copy(parameter7));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3),
+ p4 = CrossThreadCopier<P4>::copy(parameter4),
+ p5 = CrossThreadCopier<P5>::copy(parameter5),
+ p6 = CrossThreadCopier<P6>::copy(parameter6),
+ p7 = CrossThreadCopier<P7>::copy(parameter7)]() mutable {
+ (callee->*method)(p1, p2, p3, p4, p5, p6, p7);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<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>
</span><span class="lines">@@ -234,17 +232,17 @@
</span><span class="cx"> const P7& parameter7,
</span><span class="cx"> const P8& parameter8)
</span><span class="cx"> {
</span><del>- return CrossThreadTaskImpl<T, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8>(
- &callee,
- method,
- WTF::CrossThreadCopier<P1>::copy(parameter1),
- WTF::CrossThreadCopier<P2>::copy(parameter2),
- WTF::CrossThreadCopier<P3>::copy(parameter3),
- WTF::CrossThreadCopier<P4>::copy(parameter4),
- WTF::CrossThreadCopier<P5>::copy(parameter5),
- WTF::CrossThreadCopier<P6>::copy(parameter6),
- WTF::CrossThreadCopier<P7>::copy(parameter7),
- WTF::CrossThreadCopier<P8>::copy(parameter8));
</del><ins>+ return CrossThreadTask([callee = &callee, method,
+ p1 = CrossThreadCopier<P1>::copy(parameter1),
+ p2 = CrossThreadCopier<P2>::copy(parameter2),
+ p3 = CrossThreadCopier<P3>::copy(parameter3),
+ p4 = CrossThreadCopier<P4>::copy(parameter4),
+ p5 = CrossThreadCopier<P5>::copy(parameter5),
+ p6 = CrossThreadCopier<P6>::copy(parameter6),
+ p7 = CrossThreadCopier<P7>::copy(parameter7),
+ p8 = CrossThreadCopier<P8>::copy(parameter8)]() mutable {
+ (callee->*method)(p1, p2, p3, p4, p5, p6, p7, p8);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace WTF
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (201808 => 201809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-06-08 17:31:12 UTC (rev 201808)
+++ trunk/Tools/ChangeLog        2016-06-08 17:31:47 UTC (rev 201809)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-06-08 Brady Eidson <beidson@apple.com>
+
+ Make CrossThreadCopier more efficient (fewer copies!).
+ https://bugs.webkit.org/show_bug.cgi?id=158456
+
+ Reviewed by Alex Christensen.
+
+ * TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp:
+ (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2016-06-07 Filip Pizlo <fpizlo@apple.com>
</span><span class="cx">
</span><span class="cx"> Add result validation to JSAir
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFCrossThreadTaskcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp (201808 => 201809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp        2016-06-08 17:31:12 UTC (rev 201808)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp        2016-06-08 17:31:47 UTC (rev 201809)
</span><span class="lines">@@ -102,7 +102,7 @@
</span><span class="cx"> auto task = createCrossThreadTask(testFunction, logger1, logger2, logger3);
</span><span class="cx"> task.performTask();
</span><span class="cx"> }
</span><del>- ASSERT_STREQ("default_constructor(<default>-0-0) copy_constructor(<default>-1-0) name_constructor(logger-0-0) isolatedCopy() copy_constructor(<default>-1-0) isolatedCopy() copy_constructor(<default>-2-0) isolatedCopy() copy_constructor(logger-1-0) copy_constructor(<default>-2-0) copy_constructor(<default>-3-0) copy_constructor(logger-2-0) copy_constructor(<default>-3-0) copy_constructor(<default>-4-0) copy_constructor(logger-3-0) destructor(logger-2-0) destructor(<default>-3-0) destructor(<default>-2-0) destructor(logger-1-0) destructor(<default>-2-0) destructor(<default>-1-0) testFunction called destructor(logger-3-0) destructor(<default>-4-0) destructor(<default>-3-0) destructor(logger-0-0) destructor(<default>-1-0) destructor(<default>-0-0) ", takeLogStr().c_str());
</del><ins>+ ASSERT_STREQ("default_constructor(<default>-0-0) copy_constructor(<default>-1-0) name_constructor(logger-0-0) isolatedCopy() copy_constructor(<default>-1-0) isolatedCopy() copy_constructor(<default>-2-0) isolatedCopy() copy_constructor(logger-1-0) move_constructor(<default>-1-1) move_constructor(<default>-2-1) move_constructor(logger-1-1) destructor(logger-1-0) destructor(<default>-2-0) destructor(<default>-1-0) testFunction called destructor(logger-1-1) destructor(<default>-2-1) destructor(<default>-1-1) destructor(logger-0-0) destructor(<default>-1-0) destructor(<default>-0-0) ", takeLogStr().c_str());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>
</body>
</html>