<!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>[173346] 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/173346">173346</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2014-09-05 17:16:18 -0700 (Fri, 05 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>bmalloc should honor the FastMalloc statistics API
https://bugs.webkit.org/show_bug.cgi?id=136592

Reviewed by Gavin Barraclough.

Source/bmalloc:

We do this by tracking &quot;size&quot; and &quot;capacity&quot; in the VM heap.

The VM heap's &quot;capacity&quot; is all the VM we ever allocated.

The VM heap's &quot;size&quot; the subset of VM currently held onto by the
VM heap (and therefore not in use by the regular heap).

Somewhat ironically, reducing the process's memory footprint, increases
the size of the VM heap, since the VM heap holds the pages that are
purely virtual and not physical.

* bmalloc/Heap.cpp:
(bmalloc::Heap::size):
(bmalloc::Heap::capacity):
* bmalloc/Heap.h:
* bmalloc/VMHeap.cpp:
(bmalloc::VMHeap::VMHeap):
(bmalloc::VMHeap::allocateSmallChunk):
(bmalloc::VMHeap::allocateMediumChunk):
(bmalloc::VMHeap::allocateLargeChunk):
* bmalloc/VMHeap.h:
(bmalloc::VMHeap::size):
(bmalloc::VMHeap::capacity):
(bmalloc::VMHeap::allocateSmallPage):
(bmalloc::VMHeap::allocateMediumPage):
(bmalloc::VMHeap::allocateLargeRange):
(bmalloc::VMHeap::deallocateSmallPage):
(bmalloc::VMHeap::deallocateMediumPage):
(bmalloc::VMHeap::deallocateLargeRange):
* bmalloc/bmalloc.h:
(bmalloc::api::heapSize):
(bmalloc::api::heapCapacity):

Source/WTF:

* wtf/FastMalloc.cpp:
(WTF::fastMallocStatistics):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfFastMalloccpp">trunk/Source/WTF/wtf/FastMalloc.cpp</a></li>
<li><a href="#trunkSourcebmallocChangeLog">trunk/Source/bmalloc/ChangeLog</a></li>
<li><a href="#trunkSourcebmallocbmallocHeapcpp">trunk/Source/bmalloc/bmalloc/Heap.cpp</a></li>
<li><a href="#trunkSourcebmallocbmallocHeaph">trunk/Source/bmalloc/bmalloc/Heap.h</a></li>
<li><a href="#trunkSourcebmallocbmallocVMHeapcpp">trunk/Source/bmalloc/bmalloc/VMHeap.cpp</a></li>
<li><a href="#trunkSourcebmallocbmallocVMHeaph">trunk/Source/bmalloc/bmalloc/VMHeap.h</a></li>
<li><a href="#trunkSourcebmallocbmallocbmalloch">trunk/Source/bmalloc/bmalloc/bmalloc.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/WTF/ChangeLog        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -1,5 +1,15 @@
</span><span class="cx"> 2014-09-05  Geoffrey Garen  &lt;ggaren@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        bmalloc should honor the FastMalloc statistics API
+        https://bugs.webkit.org/show_bug.cgi?id=136592
+
+        Reviewed by Gavin Barraclough.
+
+        * wtf/FastMalloc.cpp:
+        (WTF::fastMallocStatistics):
+
+2014-09-05  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
</ins><span class="cx">         bmalloc should honor the FastMalloc scavenging API
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=136588
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtfFastMalloccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/FastMalloc.cpp (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/FastMalloc.cpp        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/WTF/wtf/FastMalloc.cpp        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -477,7 +477,11 @@
</span><span class="cx"> 
</span><span class="cx"> FastMallocStatistics fastMallocStatistics()
</span><span class="cx"> {
</span><del>-    FastMallocStatistics statistics = { 0, 0, 0 };
</del><ins>+    FastMallocStatistics statistics;
+    statistics.committedVMBytes = bmalloc::api::heapSize();
+    statistics.reservedVMBytes = bmalloc::api::heapCapacity();
+    statistics.freeListBytes = 0; // bmalloc doesn't really have free lists.
+
</ins><span class="cx">     return statistics;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourcebmallocChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/ChangeLog (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/ChangeLog        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/bmalloc/ChangeLog        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -1,3 +1,43 @@
</span><ins>+2014-09-05  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        bmalloc should honor the FastMalloc statistics API
+        https://bugs.webkit.org/show_bug.cgi?id=136592
+
+        Reviewed by Gavin Barraclough.
+
+        We do this by tracking &quot;size&quot; and &quot;capacity&quot; in the VM heap.
+
+        The VM heap's &quot;capacity&quot; is all the VM we ever allocated.
+
+        The VM heap's &quot;size&quot; the subset of VM currently held onto by the
+        VM heap (and therefore not in use by the regular heap).
+
+        Somewhat ironically, reducing the process's memory footprint, increases
+        the size of the VM heap, since the VM heap holds the pages that are
+        purely virtual and not physical.
+
+        * bmalloc/Heap.cpp:
+        (bmalloc::Heap::size):
+        (bmalloc::Heap::capacity):
+        * bmalloc/Heap.h:
+        * bmalloc/VMHeap.cpp:
+        (bmalloc::VMHeap::VMHeap):
+        (bmalloc::VMHeap::allocateSmallChunk):
+        (bmalloc::VMHeap::allocateMediumChunk):
+        (bmalloc::VMHeap::allocateLargeChunk):
+        * bmalloc/VMHeap.h:
+        (bmalloc::VMHeap::size):
+        (bmalloc::VMHeap::capacity):
+        (bmalloc::VMHeap::allocateSmallPage):
+        (bmalloc::VMHeap::allocateMediumPage):
+        (bmalloc::VMHeap::allocateLargeRange):
+        (bmalloc::VMHeap::deallocateSmallPage):
+        (bmalloc::VMHeap::deallocateMediumPage):
+        (bmalloc::VMHeap::deallocateLargeRange):
+        * bmalloc/bmalloc.h:
+        (bmalloc::api::heapSize):
+        (bmalloc::api::heapCapacity):
+
</ins><span class="cx"> 2014-09-02  Geoffrey Garen  &lt;ggaren@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         bmalloc crashes on the EWS bots (due to bad large object allocation)
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/Heap.cpp (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/Heap.cpp        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/bmalloc/bmalloc/Heap.cpp        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -210,4 +210,14 @@
</span><span class="cx">     m_scavenger.run();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+size_t Heap::size(std::lock_guard&lt;StaticMutex&gt;&amp;)
+{
+    return m_vmHeap.capacity() - m_vmHeap.size();
+}
+
+size_t Heap::capacity(std::lock_guard&lt;StaticMutex&gt;&amp;)
+{
+    return m_vmHeap.capacity();
+}
+
</ins><span class="cx"> } // namespace bmalloc
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocHeaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/Heap.h (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/Heap.h        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/bmalloc/bmalloc/Heap.h        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -62,7 +62,10 @@
</span><span class="cx">     void deallocateXLarge(std::lock_guard&lt;StaticMutex&gt;&amp;, void*);
</span><span class="cx"> 
</span><span class="cx">     void scavenge(std::unique_lock&lt;StaticMutex&gt;&amp;, std::chrono::milliseconds sleepDuration);
</span><del>-    
</del><ins>+
+    size_t size(std::lock_guard&lt;StaticMutex&gt;&amp;);
+    size_t capacity(std::lock_guard&lt;StaticMutex&gt;&amp;);
+
</ins><span class="cx"> private:
</span><span class="cx">     ~Heap() = delete;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocVMHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/VMHeap.cpp (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/VMHeap.cpp        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/bmalloc/bmalloc/VMHeap.cpp        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -33,6 +33,8 @@
</span><span class="cx"> namespace bmalloc {
</span><span class="cx"> 
</span><span class="cx"> VMHeap::VMHeap()
</span><ins>+    : m_size(0)
+    , m_capacity(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -41,6 +43,9 @@
</span><span class="cx">     SmallChunk* chunk = SmallChunk::create();
</span><span class="cx">     for (auto* it = chunk-&gt;begin(); it != chunk-&gt;end(); ++it)
</span><span class="cx">         m_smallPages.push(it);
</span><ins>+
+    m_size += smallChunkSize;
+    m_capacity += smallChunkSize;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void VMHeap::allocateMediumChunk()
</span><span class="lines">@@ -48,12 +53,19 @@
</span><span class="cx">     MediumChunk* chunk = MediumChunk::create();
</span><span class="cx">     for (auto* it = chunk-&gt;begin(); it != chunk-&gt;end(); ++it)
</span><span class="cx">         m_mediumPages.push(it);
</span><ins>+
+    m_size += mediumChunkSize;
+    m_capacity += mediumChunkSize;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Range VMHeap::allocateLargeChunk()
</span><span class="cx"> {
</span><span class="cx">     LargeChunk* chunk = LargeChunk::create();
</span><span class="cx">     Range result = BoundaryTag::init(chunk);
</span><ins>+
+    m_size += largeChunkSize;
+    m_capacity += largeChunkSize;
+
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocVMHeaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/VMHeap.h (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/VMHeap.h        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/bmalloc/bmalloc/VMHeap.h        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -45,6 +45,9 @@
</span><span class="cx"> public:
</span><span class="cx">     VMHeap();
</span><span class="cx"> 
</span><ins>+    size_t size() { return m_size; }
+    size_t capacity() { return m_capacity; }
+
</ins><span class="cx">     SmallPage* allocateSmallPage();
</span><span class="cx">     MediumPage* allocateMediumPage();
</span><span class="cx">     Range allocateLargeRange(size_t);
</span><span class="lines">@@ -57,7 +60,10 @@
</span><span class="cx">     void allocateSmallChunk();
</span><span class="cx">     void allocateMediumChunk();
</span><span class="cx">     Range allocateLargeChunk();
</span><del>-    
</del><ins>+
+    size_t m_size;
+    size_t m_capacity;
+
</ins><span class="cx">     Vector&lt;SmallPage*&gt; m_smallPages;
</span><span class="cx">     Vector&lt;MediumPage*&gt; m_mediumPages;
</span><span class="cx">     SegregatedFreeList m_largeRanges;
</span><span class="lines">@@ -68,6 +74,7 @@
</span><span class="cx">     if (!m_smallPages.size())
</span><span class="cx">         allocateSmallChunk();
</span><span class="cx"> 
</span><ins>+    m_size -= vmPageSize;
</ins><span class="cx">     return m_smallPages.pop();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -76,6 +83,7 @@
</span><span class="cx">     if (!m_mediumPages.size())
</span><span class="cx">         allocateMediumChunk();
</span><span class="cx"> 
</span><ins>+    m_size -= vmPageSize;
</ins><span class="cx">     return m_mediumPages.pop();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -84,6 +92,7 @@
</span><span class="cx">     Range range = m_largeRanges.take(size);
</span><span class="cx">     if (!range)
</span><span class="cx">         range = allocateLargeChunk();
</span><ins>+    m_size -= range.size();
</ins><span class="cx">     return range;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -93,6 +102,7 @@
</span><span class="cx">     vmDeallocatePhysicalPages(page-&gt;begin()-&gt;begin(), vmPageSize);
</span><span class="cx">     lock.lock();
</span><span class="cx">     
</span><ins>+    m_size += vmPageSize;
</ins><span class="cx">     m_smallPages.push(page);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -102,6 +112,7 @@
</span><span class="cx">     vmDeallocatePhysicalPages(page-&gt;begin()-&gt;begin(), vmPageSize);
</span><span class="cx">     lock.lock();
</span><span class="cx">     
</span><ins>+    m_size += vmPageSize;
</ins><span class="cx">     m_mediumPages.push(page);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -125,6 +136,7 @@
</span><span class="cx">     beginTag-&gt;setHasPhysicalPages(false);
</span><span class="cx">     endTag-&gt;setHasPhysicalPages(false);
</span><span class="cx"> 
</span><ins>+    m_size += range.size();
</ins><span class="cx">     m_largeRanges.insert(range);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocbmalloch"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/bmalloc.h (173345 => 173346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/bmalloc.h        2014-09-06 00:15:44 UTC (rev 173345)
+++ trunk/Source/bmalloc/bmalloc/bmalloc.h        2014-09-06 00:16:18 UTC (rev 173346)
</span><span class="lines">@@ -89,5 +89,17 @@
</span><span class="cx">     PerProcess&lt;Heap&gt;::get()-&gt;scavenge(lock, std::chrono::milliseconds(0));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline size_t heapSize()
+{
+    std::lock_guard&lt;StaticMutex&gt; lock(PerProcess&lt;Heap&gt;::mutex());
+    return PerProcess&lt;Heap&gt;::get()-&gt;size(lock);
+}
+
+inline size_t heapCapacity()
+{
+    std::lock_guard&lt;StaticMutex&gt; lock(PerProcess&lt;Heap&gt;::mutex());
+    return PerProcess&lt;Heap&gt;::get()-&gt;capacity(lock);
+}
+
</ins><span class="cx"> } // namespace api
</span><span class="cx"> } // namespace bmalloc
</span></span></pre>
</div>
</div>

</body>
</html>