<!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>[208754] trunk/Source/JavaScriptCore</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/208754">208754</a></dd>
<dt>Author</dt> <dd>fpizlo@apple.com</dd>
<dt>Date</dt> <dd>2016-11-15 14:02:01 -0800 (Tue, 15 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>It should be possible to disable concurrent GC timeslicing
https://bugs.webkit.org/show_bug.cgi?id=164788

Reviewed by Saam Barati.
        
Collector timeslicing means that the collector will try to pause once every 2ms. This is
great because it throttles the mutator and prevents it from outpacing the collector. But
it reduces some of the efficacy of the collectContinuously=true configuration: while
it's great that collecting continuously means that the collector will also pause more
frequently and so it will test the pausing code, it also means that the collector will
spend less time running concurrently. The primary purpose of collectContinuously is to
maximize the amount of time that the collector is running concurrently to the mutator to
maximize the likelihood that a race will cause a detectable error.
        
This adds an option to disable collector timeslicing (useCollectorTimeslicing=false).
The idea is that we will usually use this in conjunction with collectContinuously=true
to find race conditions during marking, but we can also use the two options
independently to focus our testing on other things.

* heap/Heap.cpp:
(JSC::Heap::markToFixpoint):
* heap/SlotVisitor.cpp:
(JSC::SlotVisitor::drainInParallel): We should have added this helper ages ago.
* heap/SlotVisitor.h:
* runtime/Options.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapcpp">trunk/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorcpp">trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorh">trunk/Source/JavaScriptCore/heap/SlotVisitor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionsh">trunk/Source/JavaScriptCore/runtime/Options.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (208753 => 208754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-11-15 22:00:23 UTC (rev 208753)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-11-15 22:02:01 UTC (rev 208754)
</span><span class="lines">@@ -1,5 +1,33 @@
</span><span class="cx"> 2016-11-15  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        It should be possible to disable concurrent GC timeslicing
+        https://bugs.webkit.org/show_bug.cgi?id=164788
+
+        Reviewed by Saam Barati.
+        
+        Collector timeslicing means that the collector will try to pause once every 2ms. This is
+        great because it throttles the mutator and prevents it from outpacing the collector. But
+        it reduces some of the efficacy of the collectContinuously=true configuration: while
+        it's great that collecting continuously means that the collector will also pause more
+        frequently and so it will test the pausing code, it also means that the collector will
+        spend less time running concurrently. The primary purpose of collectContinuously is to
+        maximize the amount of time that the collector is running concurrently to the mutator to
+        maximize the likelihood that a race will cause a detectable error.
+        
+        This adds an option to disable collector timeslicing (useCollectorTimeslicing=false).
+        The idea is that we will usually use this in conjunction with collectContinuously=true
+        to find race conditions during marking, but we can also use the two options
+        independently to focus our testing on other things.
+
+        * heap/Heap.cpp:
+        (JSC::Heap::markToFixpoint):
+        * heap/SlotVisitor.cpp:
+        (JSC::SlotVisitor::drainInParallel): We should have added this helper ages ago.
+        * heap/SlotVisitor.h:
+        * runtime/Options.h:
+
+2016-11-15  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
</ins><span class="cx">         The concurrent GC should have a timeslicing controller
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=164783
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.cpp (208753 => 208754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.cpp        2016-11-15 22:00:23 UTC (rev 208753)
+++ trunk/Source/JavaScriptCore/heap/Heap.cpp        2016-11-15 22:02:01 UTC (rev 208754)
</span><span class="lines">@@ -669,21 +669,23 @@
</span><span class="cx">         {
</span><span class="cx">             TimingScope traceTimingScope(*this, &quot;Heap::markToFixpoint tracing&quot;);
</span><span class="cx">             ParallelModeEnabler enabler(*m_collectorSlotVisitor);
</span><del>-            for (;;) {
-                MonotonicTime now = MonotonicTime::now();
-                SlotVisitor::SharedDrainResult drainResult;
-                if (shouldBeResumed(now)) {
-                    ResumeTheWorldScope resumeTheWorldScope(*this);
-                    m_collectorSlotVisitor-&gt;donateAndDrain(timeToStop(now));
-                    drainResult = m_collectorSlotVisitor-&gt;drainFromShared(
-                        SlotVisitor::MasterDrain, timeToStop(now));
-                } else {
-                    m_collectorSlotVisitor-&gt;donateAndDrain(timeToResume(now));
-                    drainResult = m_collectorSlotVisitor-&gt;drainFromShared(
-                        SlotVisitor::MasterDrain, timeToResume(now));
</del><ins>+            if (Options::useCollectorTimeslicing()) {
+                for (;;) {
+                    MonotonicTime now = MonotonicTime::now();
+                    SlotVisitor::SharedDrainResult drainResult;
+                    if (shouldBeResumed(now)) {
+                        ResumeTheWorldScope resumeTheWorldScope(*this);
+                        drainResult = m_collectorSlotVisitor-&gt;drainInParallel(timeToStop(now));
+                    } else
+                        drainResult = m_collectorSlotVisitor-&gt;drainInParallel(timeToResume(now));
+                    if (drainResult == SlotVisitor::SharedDrainResult::Done)
+                        break;
</ins><span class="cx">                 }
</span><del>-                if (drainResult == SlotVisitor::SharedDrainResult::Done)
-                    break;
</del><ins>+            } else {
+                // Disabling collector timeslicing is meant to be used together with
+                // --collectContinuously=true to maximize the opportunity for harmful races.
+                ResumeTheWorldScope resumeTheWorldScope(*this);
+                m_collectorSlotVisitor-&gt;drainInParallel();
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp (208753 => 208754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp        2016-11-15 22:00:23 UTC (rev 208753)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp        2016-11-15 22:02:01 UTC (rev 208754)
</span><span class="lines">@@ -473,6 +473,12 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SlotVisitor::SharedDrainResult SlotVisitor::drainInParallel(MonotonicTime timeout)
+{
+    donateAndDrain(timeout);
+    return drainFromShared(MasterDrain, timeout);
+}
+
</ins><span class="cx"> void SlotVisitor::addOpaqueRoot(void* root)
</span><span class="cx"> {
</span><span class="cx">     if (Options::numberOfGCMarkers() == 1) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitor.h (208753 => 208754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitor.h        2016-11-15 22:00:23 UTC (rev 208753)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitor.h        2016-11-15 22:02:01 UTC (rev 208754)
</span><span class="lines">@@ -105,6 +105,8 @@
</span><span class="cx">     enum class SharedDrainResult { Done, TimedOut };
</span><span class="cx">     SharedDrainResult drainFromShared(SharedDrainMode, MonotonicTime timeout = MonotonicTime::infinity());
</span><span class="cx"> 
</span><ins>+    SharedDrainResult drainInParallel(MonotonicTime timeout = MonotonicTime::infinity());
+
</ins><span class="cx">     void harvestWeakReferences();
</span><span class="cx">     void finalizeUnconditionalFinalizers();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.h (208753 => 208754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.h        2016-11-15 22:00:23 UTC (rev 208753)
+++ trunk/Source/JavaScriptCore/runtime/Options.h        2016-11-15 22:02:01 UTC (rev 208754)
</span><span class="lines">@@ -194,6 +194,7 @@
</span><span class="cx">     v(double, mediumHeapRAMFraction, 0.5, Normal, nullptr) \
</span><span class="cx">     v(double, mediumHeapGrowthFactor, 1.5, Normal, nullptr) \
</span><span class="cx">     v(double, largeHeapGrowthFactor, 1.24, Normal, nullptr) \
</span><ins>+    v(bool, useCollectorTimeslicing, true, Normal, nullptr) \
</ins><span class="cx">     v(double, concurrentGCHeadroomRatio, 1.5, Normal, nullptr) \
</span><span class="cx">     v(double, concurrentGCPeriodMS, 2, Normal, nullptr) \
</span><span class="cx">     v(bool, scribbleFreeCells, false, Normal, nullptr) \
</span></span></pre>
</div>
</div>

</body>
</html>