<!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>[181700] trunk/Source/WebKit2</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/181700">181700</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2015-03-18 10:40:34 -0700 (Wed, 18 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Prune least valuable cache entries first
https://bugs.webkit.org/show_bug.cgi?id=142810
rdar://problem/19632130

Reviewed by Darin Adler.

When pruning the cache estimate relative value of each entry using formula

age = current time - creation time
accessAge = last access time - creation time
value = accessAge / age

That is, we value entries that have been accessed recently and survived in the cache longest.

The most valuable entries don't get deleted at all while the deletion probablity ramps up for
lower value entries.

* NetworkProcess/cache/NetworkCacheFileSystemPosix.h:
(WebKit::NetworkCache::fileTimes):

    Get the creation time and access time for a file.

(WebKit::NetworkCache::updateFileAccessTimeIfNeeded):

    Update access time manually if the file system doesn't do it automatically.

* NetworkProcess/cache/NetworkCacheIOChannel.h:
(WebKit::NetworkCache::IOChannel::path):
(WebKit::NetworkCache::IOChannel::type):
* NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm:
(WebKit::NetworkCache::IOChannel::IOChannel):
(WebKit::NetworkCache::IOChannel::open):

    Remember the file path and move most of the work to constructor.

* NetworkProcess/cache/NetworkCacheStorage.cpp:
(WebKit::NetworkCache::Storage::Storage):
(WebKit::NetworkCache::Storage::remove):
(WebKit::NetworkCache::Storage::updateFileAccessTime):
(WebKit::NetworkCache::Storage::dispatchReadOperation):
(WebKit::NetworkCache::deletionProbability):

    Compute the probability based on entry age and access time.

(WebKit::NetworkCache::Storage::shrinkIfNeeded):
* NetworkProcess/cache/NetworkCacheStorage.h:
(WebKit::NetworkCache::Storage::serialBackgroundIOQueue):
(WebKit::NetworkCache::Storage::deleteQueue): Deleted.

    More generic name.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheFileSystemPosixh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystemPosix.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelCocoamm">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStoragecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (181699 => 181700)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-18 17:27:22 UTC (rev 181699)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-18 17:40:34 UTC (rev 181700)
</span><span class="lines">@@ -1,3 +1,56 @@
</span><ins>+2015-03-17  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Prune least valuable cache entries first
+        https://bugs.webkit.org/show_bug.cgi?id=142810
+        rdar://problem/19632130
+
+        Reviewed by Darin Adler.
+
+        When pruning the cache estimate relative value of each entry using formula
+
+        age = current time - creation time
+        accessAge = last access time - creation time
+        value = accessAge / age
+
+        That is, we value entries that have been accessed recently and survived in the cache longest.
+
+        The most valuable entries don't get deleted at all while the deletion probablity ramps up for
+        lower value entries.
+
+        * NetworkProcess/cache/NetworkCacheFileSystemPosix.h:
+        (WebKit::NetworkCache::fileTimes):
+
+            Get the creation time and access time for a file.
+
+        (WebKit::NetworkCache::updateFileAccessTimeIfNeeded):
+
+            Update access time manually if the file system doesn't do it automatically.
+
+        * NetworkProcess/cache/NetworkCacheIOChannel.h:
+        (WebKit::NetworkCache::IOChannel::path):
+        (WebKit::NetworkCache::IOChannel::type):
+        * NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm:
+        (WebKit::NetworkCache::IOChannel::IOChannel):
+        (WebKit::NetworkCache::IOChannel::open):
+
+            Remember the file path and move most of the work to constructor.
+
+        * NetworkProcess/cache/NetworkCacheStorage.cpp:
+        (WebKit::NetworkCache::Storage::Storage):
+        (WebKit::NetworkCache::Storage::remove):
+        (WebKit::NetworkCache::Storage::updateFileAccessTime):
+        (WebKit::NetworkCache::Storage::dispatchReadOperation):
+        (WebKit::NetworkCache::deletionProbability):
+
+            Compute the probability based on entry age and access time.
+
+        (WebKit::NetworkCache::Storage::shrinkIfNeeded):
+        * NetworkProcess/cache/NetworkCacheStorage.h:
+        (WebKit::NetworkCache::Storage::serialBackgroundIOQueue):
+        (WebKit::NetworkCache::Storage::deleteQueue): Deleted.
+
+            More generic name.
+
</ins><span class="cx"> 2015-03-18  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] Log total number of network cache queries using diagnostic logging
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheFileSystemPosixh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystemPosix.h (181699 => 181700)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystemPosix.h        2015-03-18 17:27:22 UTC (rev 181699)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheFileSystemPosix.h        2015-03-18 17:40:34 UTC (rev 181700)
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> #include &quot;NetworkCacheKey.h&quot;
</span><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><span class="cx"> #include &lt;dirent.h&gt;
</span><ins>+#include &lt;sys/stat.h&gt;
+#include &lt;sys/time.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -67,9 +69,34 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+struct FileTimes {
+    std::chrono::system_clock::time_point creation;
+    std::chrono::system_clock::time_point access;
+};
+
+inline FileTimes fileTimes(const String&amp; path)
+{
+    struct stat fileInfo;
+    if (stat(WebCore::fileSystemRepresentation(path).data(), &amp;fileInfo))
+        return { };
+    return { std::chrono::system_clock::from_time_t(fileInfo.st_birthtime), std::chrono::system_clock::from_time_t(fileInfo.st_atime) };
</ins><span class="cx"> }
</span><ins>+
+inline void updateFileAccessTimeIfNeeded(const String&amp; path)
+{
+    auto times = fileTimes(path);
+    if (times.creation != times.access) {
+        // Don't update more than once per hour;
+        if (std::chrono::system_clock::now() - times.access &lt; std::chrono::hours(1))
+            return;
+    }
+    // This really updates both access time and modification time.
+    utimes(WebCore::fileSystemRepresentation(path).data(), 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}
+}
+
</ins><span class="cx"> #endif // ENABLE(NETWORK_CACHE)
</span><span class="cx"> 
</span><span class="cx"> #endif // NetworkCacheFileSystemPosix_h
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h (181699 => 181700)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h        2015-03-18 17:27:22 UTC (rev 181699)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h        2015-03-18 17:40:34 UTC (rev 181700)
</span><span class="lines">@@ -45,15 +45,21 @@
</span><span class="cx">     void readSync(size_t offset, size_t, std::function&lt;void (Data&amp;, int error)&gt;);
</span><span class="cx">     void write(size_t offset, const Data&amp;, std::function&lt;void (int error)&gt;);
</span><span class="cx"> 
</span><ins>+    const String&amp; path() const { return m_path; }
+    Type type() const { return m_type; }
+
</ins><span class="cx">     int fileDescriptor() const { return m_fileDescriptor; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    IOChannel(int fd);
</del><ins>+    IOChannel(const String&amp; filePath, IOChannel::Type);
</ins><span class="cx"> 
</span><ins>+    String m_path;
+    Type m_type;
+
+    int m_fileDescriptor { 0 };
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     DispatchPtr&lt;dispatch_io_t&gt; m_dispatchIO;
</span><span class="cx"> #endif
</span><del>-    int m_fileDescriptor { 0 };
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm (181699 => 181700)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm        2015-03-18 17:27:22 UTC (rev 181699)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm        2015-03-18 17:40:34 UTC (rev 181700)
</span><span class="lines">@@ -39,23 +39,14 @@
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> namespace NetworkCache {
</span><span class="cx"> 
</span><del>-IOChannel::IOChannel(int fd)
-    : m_fileDescriptor(fd)
</del><ins>+IOChannel::IOChannel(const String&amp; filePath, Type type)
+    : m_path(filePath)
+    , m_type(type)
</ins><span class="cx"> {
</span><del>-    m_dispatchIO = adoptDispatch(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd](int) {
-        close(fd);
-    }));
-    ASSERT(m_dispatchIO.get());
-    // This makes the channel read/write all data before invoking the handlers.
-    dispatch_io_set_low_water(m_dispatchIO.get(), std::numeric_limits&lt;size_t&gt;::max());
-}
-
-Ref&lt;IOChannel&gt; IOChannel::open(const String&amp; filePath, IOChannel::Type type)
-{
</del><span class="cx">     int oflag;
</span><span class="cx">     mode_t mode;
</span><span class="cx"> 
</span><del>-    switch (type) {
</del><ins>+    switch (m_type) {
</ins><span class="cx">     case Type::Create:
</span><span class="cx">         oflag = O_RDWR | O_CREAT | O_TRUNC | O_NONBLOCK;
</span><span class="cx">         mode = S_IRUSR | S_IWUSR;
</span><span class="lines">@@ -71,10 +62,21 @@
</span><span class="cx"> 
</span><span class="cx">     CString path = WebCore::fileSystemRepresentation(filePath);
</span><span class="cx">     int fd = ::open(path.data(), oflag, mode);
</span><ins>+    m_fileDescriptor = fd;
</ins><span class="cx"> 
</span><del>-    return adoptRef(*new IOChannel(fd));
</del><ins>+    m_dispatchIO = adoptDispatch(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd](int) {
+        close(fd);
+    }));
+    ASSERT(m_dispatchIO.get());
+    // This makes the channel read/write all data before invoking the handlers.
+    dispatch_io_set_low_water(m_dispatchIO.get(), std::numeric_limits&lt;size_t&gt;::max());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Ref&lt;IOChannel&gt; IOChannel::open(const String&amp; filePath, IOChannel::Type type)
+{
+    return adoptRef(*new IOChannel(filePath, type));
+}
+
</ins><span class="cx"> void IOChannel::read(size_t offset, size_t size, std::function&lt;void (Data&amp;, int error)&gt; completionHandler)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;IOChannel&gt; channel(this);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStoragecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp (181699 => 181700)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp        2015-03-18 17:27:22 UTC (rev 181699)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp        2015-03-18 17:40:34 UTC (rev 181700)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">     , m_directoryPath(makeVersionedDirectoryPath(baseDirectoryPath))
</span><span class="cx">     , m_ioQueue(WorkQueue::create(&quot;com.apple.WebKit.Cache.Storage&quot;, WorkQueue::Type::Concurrent))
</span><span class="cx">     , m_backgroundIOQueue(WorkQueue::create(&quot;com.apple.WebKit.Cache.Storage.background&quot;, WorkQueue::Type::Concurrent, WorkQueue::QOS::Background))
</span><del>-    , m_deleteQueue(WorkQueue::create(&quot;com.apple.WebKit.Cache.Storage.delete&quot;, WorkQueue::Type::Serial, WorkQueue::QOS::Background))
</del><ins>+    , m_serialBackgroundIOQueue(WorkQueue::create(&quot;com.apple.WebKit.Cache.Storage.serialBackground&quot;, WorkQueue::Type::Serial, WorkQueue::QOS::Background))
</ins><span class="cx"> {
</span><span class="cx">     deleteOldVersions();
</span><span class="cx">     initialize();
</span><span class="lines">@@ -282,11 +282,19 @@
</span><span class="cx">         m_contentsFilter.remove(key.shortHash());
</span><span class="cx"> 
</span><span class="cx">     StringCapture filePathCapture(filePathForKey(key, m_directoryPath));
</span><del>-    deleteQueue().dispatch([this, filePathCapture] {
</del><ins>+    serialBackgroundIOQueue().dispatch([this, filePathCapture] {
</ins><span class="cx">         WebCore::deleteFile(filePathCapture.string());
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Storage::updateFileAccessTime(IOChannel&amp; channel)
+{
+    StringCapture filePathCapture(channel.path());
+    serialBackgroundIOQueue().dispatch([filePathCapture] {
+        updateFileAccessTimeIfNeeded(filePathCapture.string());
+    });
+}
+
</ins><span class="cx"> void Storage::dispatchReadOperation(const ReadOperation&amp; read)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="lines">@@ -294,16 +302,17 @@
</span><span class="cx"> 
</span><span class="cx">     StringCapture cachePathCapture(m_directoryPath);
</span><span class="cx">     ioQueue().dispatch([this, &amp;read, cachePathCapture] {
</span><del>-        auto channel = openFileForKey(read.key, IOChannel::Type::Read, cachePathCapture.string());
-        int fd = channel-&gt;fileDescriptor();
-        channel-&gt;read(0, std::numeric_limits&lt;size_t&gt;::max(), [this, &amp;read, fd](Data&amp; fileData, int error) {
</del><ins>+        RefPtr&lt;IOChannel&gt; channel = openFileForKey(read.key, IOChannel::Type::Read, cachePathCapture.string());
+        channel-&gt;read(0, std::numeric_limits&lt;size_t&gt;::max(), [this, channel, &amp;read](Data&amp; fileData, int error) {
</ins><span class="cx">             if (error) {
</span><span class="cx">                 remove(read.key);
</span><span class="cx">                 read.completionHandler(nullptr);
</span><span class="cx">             } else {
</span><del>-                auto entry = decodeEntry(fileData, fd, read.key);
</del><ins>+                auto entry = decodeEntry(fileData, channel-&gt;fileDescriptor(), read.key);
</ins><span class="cx">                 bool success = read.completionHandler(WTF::move(entry));
</span><del>-                if (!success)
</del><ins>+                if (success)
+                    updateFileAccessTime(*channel);
+                else
</ins><span class="cx">                     remove(read.key);
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="lines">@@ -569,12 +578,31 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static double deletionProbability(FileTimes times)
+{
+    static const double maximumProbability { 0.33 };
+
+    using namespace std::chrono;
+    auto age = system_clock::now() - times.creation;
+    auto accessAge = times.access - times.creation;
+
+    // For sanity.
+    if (age &lt;= seconds::zero() || accessAge &lt; seconds::zero() || accessAge &gt; age)
+        return maximumProbability;
+
+    // We like old entries that have been accessed recently.
+    auto relativeValue = duration&lt;double&gt;(accessAge) / age;
+
+    // Adjust a bit so the most valuable entries don't get deleted at all.
+    auto effectiveValue = std::min(1.1 * relativeValue, 1.);
+
+    return (1 - effectiveValue) * maximumProbability;
+}
+
</ins><span class="cx"> void Storage::shrinkIfNeeded()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="cx"> 
</span><del>-    static const double deletionProbability { 0.25 };
-
</del><span class="cx">     if (m_approximateSize &lt;= m_maximumSize)
</span><span class="cx">         return;
</span><span class="cx">     if (m_shrinkInProgress)
</span><span class="lines">@@ -591,7 +619,12 @@
</span><span class="cx">         traverseCacheFiles(cachePath, [this](const String&amp; fileName, const String&amp; partitionPath) {
</span><span class="cx">             auto filePath = WebCore::pathByAppendingComponent(partitionPath, fileName);
</span><span class="cx"> 
</span><del>-            bool shouldDelete = randomNumber() &lt; deletionProbability;
</del><ins>+            auto times = fileTimes(filePath);
+            auto probability = deletionProbability(times);
+            bool shouldDelete = randomNumber() &lt; probability;
+
+            LOG(NetworkCacheStorage, &quot;Deletion probability=%f shouldDelete=%d&quot;, probability, shouldDelete);
+
</ins><span class="cx">             if (!shouldDelete) {
</span><span class="cx">                 long long fileSize = 0;
</span><span class="cx">                 WebCore::getFileSize(filePath, fileSize);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h (181699 => 181700)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-18 17:27:22 UTC (rev 181699)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-18 17:40:34 UTC (rev 181700)
</span><span class="lines">@@ -40,6 +40,8 @@
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> namespace NetworkCache {
</span><span class="cx"> 
</span><ins>+class IOChannel;
+
</ins><span class="cx"> class Storage {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(Storage);
</span><span class="cx"> public:
</span><span class="lines">@@ -95,9 +97,11 @@
</span><span class="cx">     void dispatchHeaderWriteOperation(const WriteOperation&amp;);
</span><span class="cx">     void dispatchPendingWriteOperations();
</span><span class="cx"> 
</span><ins>+    void updateFileAccessTime(IOChannel&amp;);
+
</ins><span class="cx">     WorkQueue&amp; ioQueue() { return m_ioQueue.get(); }
</span><span class="cx">     WorkQueue&amp; backgroundIOQueue() { return m_backgroundIOQueue.get(); }
</span><del>-    WorkQueue&amp; deleteQueue() { return m_deleteQueue.get(); }
</del><ins>+    WorkQueue&amp; serialBackgroundIOQueue() { return m_serialBackgroundIOQueue.get(); }
</ins><span class="cx"> 
</span><span class="cx">     const String m_baseDirectoryPath;
</span><span class="cx">     const String m_directoryPath;
</span><span class="lines">@@ -117,7 +121,7 @@
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;WorkQueue&gt; m_ioQueue;
</span><span class="cx">     Ref&lt;WorkQueue&gt; m_backgroundIOQueue;
</span><del>-    Ref&lt;WorkQueue&gt; m_deleteQueue;
</del><ins>+    Ref&lt;WorkQueue&gt; m_serialBackgroundIOQueue;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>