[prev in list] [next in list] [prev in thread] [next in thread] 

List:       webkit-changes
Subject:    [webkit-changes] [74441] trunk/JavaScriptCore
From:       barraclough () apple ! com
Date:       2010-12-22 1:30:18
Message-ID: 20101222013018.90E47605E2D2 () beta ! macosforge ! org
[Download RAW message or body]

[Attachment #2 (text/html)]

<!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>[74441] trunk/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/74441">74441</a></dd> \
<dt>Author</dt> <dd>barraclough@apple.com</dd> <dt>Date</dt> <dd>2010-12-21 17:30:12 \
-0800 (Tue, 21 Dec 2010)</dd> </dl>

<h3>Log Message</h3>
<pre>&lt;rdar://problem/8241425&gt; JIT executable memory excessive usage due to \
regex caching https://bugs.webkit.org/show_bug.cgi?id=51434

Reviewed by Geoff Garen.

Reduce the amount of memory the RegExpCache can hold on to on iOS.
Currently the RegExpCache can hold 256 RegExp objects. If each falls into a separate
ExecutablePool, with a common size of 16Kb, this means we end up holding onto 4Mb of
memory. Firstly, we can reduce this by simply reducing the size of the cache to 32
entries. Secondly, we can use a separate set of ExecutablePools for JIT code \
generated from RegExp objects. This helps in two ways (1) it increases the \
probability that RegExps in the cache share the same pool, and (2) it means that a \
RegExp can't end up holding on to a large ExecutablePool containing a translation of \
JS code. (A RegExp could end up keeping a larger RegExp alive that happened to be \
sharing the same pool, but large RegExp patterns are less common).

* runtime/JSGlobalData.h:
* runtime/RegExpCache.h:
* yarr/RegexJIT.cpp:
(JSC::Yarr::RegexGenerator::compile):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJavaScriptCoreChangeLog">trunk/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkJavaScriptCoreruntimeJSGlobalDatah">trunk/JavaScriptCore/runtime/JSGlobalData.h</a></li>
 <li><a href="#trunkJavaScriptCoreruntimeRegExpCacheh">trunk/JavaScriptCore/runtime/RegExpCache.h</a></li>
 <li><a href="#trunkJavaScriptCoreyarrRegexJITcpp">trunk/JavaScriptCore/yarr/RegexJIT.cpp</a></li>
 </ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/ChangeLog (74440 => \
74441)</h4> <pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/ChangeLog	2010-12-22 01:08:31 UTC (rev \
                74440)
+++ trunk/JavaScriptCore/ChangeLog	2010-12-22 01:30:12 UTC (rev 74441)
</span><span class="lines">@@ -1,5 +1,28 @@
</span><span class="cx"> 2010-12-21  Gavin Barraclough  &lt;barraclough@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Reviewed by Geoff Garen.
+
+        &lt;rdar://problem/8241425&gt; JIT executable memory excessive usage due to \
regex caching +        https://bugs.webkit.org/show_bug.cgi?id=51434
+
+        Reduce the amount of memory the RegExpCache can hold on to on iOS.
+        Currently the RegExpCache can hold 256 RegExp objects. If each falls into a \
separate +        ExecutablePool, with a common size of 16Kb, this means we end up \
holding onto 4Mb of +        memory. Firstly, we can reduce this by simply reducing \
the size of the cache to 32 +        entries. Secondly, we can use a separate set of \
ExecutablePools for JIT code generated +        from RegExp objects. This helps in \
two ways (1) it increases the probability that +        RegExps in the cache share \
the same pool, and (2) it means that a RegExp can't end +        up holding on to a \
large ExecutablePool containing a translation of JS code. +        (A RegExp could \
end up keeping a larger RegExp alive that happened to be sharing the +        same \
pool, but large RegExp patterns are less common). +
+        * runtime/JSGlobalData.h:
+        * runtime/RegExpCache.h:
+        * yarr/RegexJIT.cpp:
+        (JSC::Yarr::RegexGenerator::compile):
+
+2010-12-21  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
</ins><span class="cx">         Windows build fix.
</span><span class="cx"> 
</span><span class="cx">         * \
JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: </span></span></pre></div>
<a id="trunkJavaScriptCoreruntimeJSGlobalDatah"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/runtime/JSGlobalData.h (74440 \
=> 74441)</h4> <pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/runtime/JSGlobalData.h	2010-12-22 \
                01:08:31 UTC (rev 74440)
+++ trunk/JavaScriptCore/runtime/JSGlobalData.h	2010-12-22 01:30:12 UTC (rev 74441)
</span><span class="lines">@@ -170,6 +170,7 @@
</span><span class="cx">         
</span><span class="cx"> #if ENABLE(ASSEMBLER)
</span><span class="cx">         ExecutableAllocator executableAllocator;
</span><ins>+        ExecutableAllocator regexAllocator;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if !ENABLE(JIT)
</span></span></pre></div>
<a id="trunkJavaScriptCoreruntimeRegExpCacheh"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/runtime/RegExpCache.h (74440 \
=> 74441)</h4> <pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/runtime/RegExpCache.h	2010-12-22 01:08:31 \
                UTC (rev 74440)
+++ trunk/JavaScriptCore/runtime/RegExpCache.h	2010-12-22 01:30:12 UTC (rev 74441)
</span><span class="lines">@@ -47,7 +47,14 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     static const unsigned maxCacheablePatternLength = 256;
</span><ins>+
+#if PLATFORM(IOS)
+    // The RegExpCache can currently hold onto multiple Mb of memory;
+    // as a short-term fix some embedded platforms may wish to reduce the cache \
size. +    static const int maxCacheableEntries = 32;
+#else
</ins><span class="cx">     static const int maxCacheableEntries = 256;
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     FixedArray&lt;RegExpKey, maxCacheableEntries&gt; \
patternKeyArray; </span><span class="cx">     RegExpCacheMap m_cacheMap;
</span></span></pre></div>
<a id="trunkJavaScriptCoreyarrRegexJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/yarr/RegexJIT.cpp (74440 => \
74441)</h4> <pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/yarr/RegexJIT.cpp	2010-12-22 01:08:31 UTC \
                (rev 74440)
+++ trunk/JavaScriptCore/yarr/RegexJIT.cpp	2010-12-22 01:30:12 UTC (rev 74441)
</span><span class="lines">@@ -2186,7 +2186,7 @@
</span><span class="cx">     {
</span><span class="cx">         generate();
</span><span class="cx"> 
</span><del>-        LinkBuffer patchBuffer(this, \
globalData-&gt;executableAllocator.poolForSize(size()), 0); </del><ins>+        \
LinkBuffer patchBuffer(this, globalData-&gt;regexAllocator.poolForSize(size()), 0); \
</ins><span class="cx">  </span><span class="cx">         for (unsigned i = 0; i &lt; \
m_expressionState.m_backtrackRecords.size(); ++i) </span><span class="cx">            \
patchBuffer.patch(m_expressionState.m_backtrackRecords[i].dataLabel, \
patchBuffer.locationOf(m_expressionState.m_backtrackRecords[i].backtrackLocation)); \
</span></span></pre> </div>
</div>

</body>
</html>



_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic