<!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>[82633] trunk/Source/WebCore</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/82633">82633</a></dd>
<dt>Author</dt> <dd>aroben@apple.com</dd>
<dt>Date</dt> <dd>2011-03-31 16:15:52 -0700 (Thu, 31 Mar 2011)</dd>
</dl>

<h3>Log Message</h3>
<pre>Don't ref CACFLayerTreeHosts when telling them to flush layer changes

LayerChangesFlusher was reffing CACFLayerTreeHosts before calling out to them. This would
have protected us if calling out to one CACFLayerTreeHost could cause a different
CACFLayerTreeHost to be destroyed. But that isn't possible; each CACFLayerTreeHost is
associated with its own page, and flushing layer changes doesn't touch any other page. So it
isn't possible for a CACFLayerTreeHost to be deleted while another one is flushing layer
changes.

One benefit of this change is that it will make it easier to make LayerChangesFlusher
interact with a forthcoming abstract base class, rather than with CACFLayerTreeHost itself.

This should cause no change in behavior.

Fixes <http://webkit.org/b/57590> LayerChangesFlusher unnecessarily refs CACFLayerTreeHost
before calling out to it

Reviewed by Darin Adler.

* platform/graphics/ca/win/LayerChangesFlusher.cpp:
(WebCore::LayerChangesFlusher::hookFired): Just store bare pointers to the
CACFLayerTreeHosts.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscawinLayerChangesFlushercpp">trunk/Source/WebCore/platform/graphics/ca/win/LayerChangesFlusher.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (82632 => 82633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2011-03-31 23:05:44 UTC (rev 82632)
+++ trunk/Source/WebCore/ChangeLog      2011-03-31 23:15:52 UTC (rev 82633)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2011-03-31  Adam Roben  <aroben@apple.com>
+
+        Don't ref CACFLayerTreeHosts when telling them to flush layer changes
+
+        LayerChangesFlusher was reffing CACFLayerTreeHosts before calling out to them. This would
+        have protected us if calling out to one CACFLayerTreeHost could cause a different
+        CACFLayerTreeHost to be destroyed. But that isn't possible; each CACFLayerTreeHost is
+        associated with its own page, and flushing layer changes doesn't touch any other page. So it
+        isn't possible for a CACFLayerTreeHost to be deleted while another one is flushing layer
+        changes.
+
+        One benefit of this change is that it will make it easier to make LayerChangesFlusher
+        interact with a forthcoming abstract base class, rather than with CACFLayerTreeHost itself.
+
+        This should cause no change in behavior.
+
+        Fixes <http://webkit.org/b/57590> LayerChangesFlusher unnecessarily refs CACFLayerTreeHost
+        before calling out to it
+
+        Reviewed by Darin Adler.
+
+        * platform/graphics/ca/win/LayerChangesFlusher.cpp:
+        (WebCore::LayerChangesFlusher::hookFired): Just store bare pointers to the
+        CACFLayerTreeHosts.
+
</ins><span class="cx"> 2011-03-31  Antti Koivisto  <antti@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Oliver Hunt.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscawinLayerChangesFlushercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/win/LayerChangesFlusher.cpp (82632 => 82633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/win/LayerChangesFlusher.cpp    2011-03-31 23:05:44 UTC (rev 82632)
+++ trunk/Source/WebCore/platform/graphics/ca/win/LayerChangesFlusher.cpp       2011-03-31 23:15:52 UTC (rev 82633)
</span><span class="lines">@@ -80,9 +80,8 @@
</span><span class="cx">     ASSERT(m_hook);
</span><span class="cx"> 
</span><span class="cx">     // Calling out to the hosts can cause m_hostsWithChangesToFlush to be modified, so we copy it
</span><del>-    // into a Vector first. We have to hold a reference to them because otherwise they could be
-    // destroyed while we're calling out to them.
-    Vector<RefPtr<CACFLayerTreeHost> > hosts;
</del><ins>+    // into a Vector first.
+    Vector<CACFLayerTreeHost*> hosts;
</ins><span class="cx">     copyToVector(m_hostsWithChangesToFlush, hosts);
</span><span class="cx">     m_hostsWithChangesToFlush.clear();
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>