<!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>[181020] 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/181020">181020</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2015-03-04 13:35:11 -0800 (Wed, 04 Mar 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Factor platform I/O out from NetworkCacheStorage
https://bugs.webkit.org/show_bug.cgi?id=142279
Reviewed by Chris Dumez.
* NetworkProcess/cache/NetworkCacheData.h: Added.
* NetworkProcess/cache/NetworkCacheDataCocoa.mm: Added.
NetworkCacheStorage::Data -> NetworkCacheData
Move to files of its own.
* NetworkProcess/cache/NetworkCacheIOChannel.h: Added.
* NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm: Added.
Add abstraction for dispatch IO channels.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageCocoamm">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDatah">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDataCocoamm">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm</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>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-03-04 Antti Koivisto <antti@apple.com>
+
+ Factor platform I/O out from NetworkCacheStorage
+ https://bugs.webkit.org/show_bug.cgi?id=142279
+
+ Reviewed by Chris Dumez.
+
+ * NetworkProcess/cache/NetworkCacheData.h: Added.
+ * NetworkProcess/cache/NetworkCacheDataCocoa.mm: Added.
+
+ NetworkCacheStorage::Data -> NetworkCacheData
+ Move to files of its own.
+
+ * NetworkProcess/cache/NetworkCacheIOChannel.h: Added.
+ * NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm: Added.
+
+ Add abstraction for dispatch IO channels.
+
</ins><span class="cx"> 2015-03-04 Joseph Pecoraro <pecoraro@apple.com>
</span><span class="cx">
</span><span class="cx"> Remove WK_AVAILABLE and related macros when we cannot determine iOS/Mac version
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> if (partition.isEmpty())
</span><span class="cx"> partition = ASCIILiteral("No partition");
</span><del>- return NetworkCacheKey(request.httpMethod(), partition, request.url().string());
</del><ins>+ return { request.httpMethod(), partition, request.url().string() };
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static NetworkCacheStorage::Entry encodeStorageEntry(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, PassRefPtr<WebCore::SharedBuffer> responseData)
</span><span class="lines">@@ -120,12 +120,12 @@
</span><span class="cx"> encoder.encodeChecksum();
</span><span class="cx">
</span><span class="cx"> auto timeStamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
</span><del>- NetworkCacheStorage::Data header(encoder.buffer(), encoder.bufferSize());
- NetworkCacheStorage::Data body;
</del><ins>+ NetworkCacheData header(encoder.buffer(), encoder.bufferSize());
+ NetworkCacheData body;
</ins><span class="cx"> if (responseData)
</span><del>- body = NetworkCacheStorage::Data(reinterpret_cast<const uint8_t*>(responseData->data()), responseData->size());
</del><ins>+ body = { reinterpret_cast<const uint8_t*>(responseData->data()), responseData->size() };
</ins><span class="cx">
</span><del>- return NetworkCacheStorage::Entry { makeCacheKey(request), timeStamp, header, body };
</del><ins>+ return { makeCacheKey(request), timeStamp, header, body };
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static bool verifyVaryingRequestHeaders(const Vector<std::pair<String, String>>& varyingRequestHeaders, const WebCore::ResourceRequest& request)
</span><span class="lines">@@ -343,7 +343,7 @@
</span><span class="cx">
</span><span class="cx"> auto storageEntry = encodeStorageEntry(originalRequest, response, WTF::move(responseData));
</span><span class="cx">
</span><del>- m_storage->store(storageEntry, [completionHandler](bool success, const NetworkCacheStorage::Data& bodyData) {
</del><ins>+ m_storage->store(storageEntry, [completionHandler](bool success, const NetworkCacheData& bodyData) {
</ins><span class="cx"> MappedBody mappedBody;
</span><span class="cx"> #if ENABLE(SHAREABLE_RESOURCE)
</span><span class="cx"> if (bodyData.isMap()) {
</span><span class="lines">@@ -367,7 +367,7 @@
</span><span class="cx">
</span><span class="cx"> auto updateEntry = encodeStorageEntry(originalRequest, response, entry.buffer);
</span><span class="cx">
</span><del>- m_storage->update(updateEntry, entry.storageEntry, [](bool success, const NetworkCacheStorage::Data&) {
</del><ins>+ m_storage->update(updateEntry, entry.storageEntry, [](bool success, const NetworkCacheData&) {
</ins><span class="cx"> LOG(NetworkCache, "(NetworkProcess) updated, success=%d", success);
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDatah"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h         (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,125 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NetworkCacheData_h
+#define NetworkCacheData_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include <functional>
+#include <wtf/FunctionDispatcher.h>
+#include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+#if PLATFORM(COCOA)
+template <typename T> class DispatchPtr;
+template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject);
+
+// FIXME: Use OSObjectPtr instead when it works with dispatch_data_t on all platforms.
+template<typename T> class DispatchPtr {
+public:
+ DispatchPtr()
+ : m_ptr(nullptr)
+ {
+ }
+ DispatchPtr(T ptr)
+ : m_ptr(ptr)
+ {
+ if (m_ptr)
+ dispatch_retain(m_ptr);
+ }
+ DispatchPtr(const DispatchPtr& other)
+ : m_ptr(other.m_ptr)
+ {
+ if (m_ptr)
+ dispatch_retain(m_ptr);
+ }
+ ~DispatchPtr()
+ {
+ if (m_ptr)
+ dispatch_release(m_ptr);
+ }
+
+ DispatchPtr& operator=(const DispatchPtr& other)
+ {
+ auto copy = other;
+ std::swap(m_ptr, copy.m_ptr);
+ return *this;
+ }
+
+ T get() const { return m_ptr; }
+ explicit operator bool() const { return m_ptr; }
+
+ friend DispatchPtr adoptDispatch<T>(T);
+
+private:
+ struct Adopt { };
+ DispatchPtr(Adopt, T data)
+ : m_ptr(data)
+ {
+ }
+
+ T m_ptr;
+};
+
+template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject)
+{
+ return DispatchPtr<T>(typename DispatchPtr<T>::Adopt { }, dispatchObject);
+}
+#endif
+
+class NetworkCacheData {
+public:
+ NetworkCacheData() { }
+ NetworkCacheData(const uint8_t*, size_t);
+
+ enum class Backing { Buffer, Map };
+#if PLATFORM(COCOA)
+ NetworkCacheData(DispatchPtr<dispatch_data_t>, Backing = Backing::Buffer);
+#endif
+ bool isNull() const;
+
+ const uint8_t* data() const;
+ size_t size() const { return m_size; }
+ bool isMap() const { return m_isMap; }
+
+#if PLATFORM(COCOA)
+ dispatch_data_t dispatchData() const { return m_dispatchData.get(); }
+#endif
+private:
+#if PLATFORM(COCOA)
+ mutable DispatchPtr<dispatch_data_t> m_dispatchData;
+#endif
+ mutable const uint8_t* m_data { nullptr };
+ size_t m_size { 0 };
+ bool m_isMap { false };
+};
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDataCocoamm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm         (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,70 @@
</span><ins>+/*
+ * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NetworkCachedata.h"
+
+#if ENABLE(NETWORK_CACHE)
+
+#include <dispatch/dispatch.h>
+
+namespace WebKit {
+
+NetworkCacheData::NetworkCacheData(const uint8_t* data, size_t size)
+ : m_dispatchData(adoptDispatch(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))
+ , m_size(size)
+{
+}
+
+NetworkCacheData::NetworkCacheData(DispatchPtr<dispatch_data_t> dispatchData, Backing backing)
+{
+ if (!dispatchData)
+ return;
+ const void* data;
+ m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &data, &m_size));
+ m_data = static_cast<const uint8_t*>(data);
+ m_isMap = m_size && backing == Backing::Map;
+}
+
+const uint8_t* NetworkCacheData::data() const
+{
+ if (!m_data) {
+ const void* data;
+ size_t size;
+ m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &data, &size));
+ ASSERT(size == m_size);
+ m_data = static_cast<const uint8_t*>(data);
+ }
+ return m_data;
+}
+
+bool NetworkCacheData::isNull() const
+{
+ return !m_dispatchData;
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h         (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,60 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NetworkCacheIOChannel_h
+#define NetworkCacheIOChannel_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include "NetworkCacheData.h"
+#include <functional>
+#include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+class NetworkCacheIOChannel : public ThreadSafeRefCounted<NetworkCacheIOChannel> {
+public:
+ enum class Type { Read, Write, Create };
+ static Ref<NetworkCacheIOChannel> open(const String& file, Type);
+
+ void read(size_t offset, size_t, std::function<void (NetworkCacheData&, int error)>);
+ void write(size_t offset, const NetworkCacheData&, std::function<void (int error)>);
+
+ int fileDescriptor() const { return m_fileDescriptor; }
+
+private:
+ NetworkCacheIOChannel(int fd);
+
+#if PLATFORM(COCOA)
+ DispatchPtr<dispatch_io_t> m_dispatchIO;
+#endif
+ int m_fileDescriptor { 0 };
+};
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelCocoamm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm         (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,107 @@
</span><ins>+/*
+ * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NetworkCacheIOChannel.h"
+
+#if ENABLE(NETWORK_CACHE)
+
+#include "NetworkCacheFileSystemPosix.h"
+#include <dispatch/dispatch.h>
+#include <mach/vm_param.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/StringBuilder.h>
+
+namespace WebKit {
+
+NetworkCacheIOChannel::NetworkCacheIOChannel(int fd)
+ : m_fileDescriptor(fd)
+{
+ 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<size_t>::max());
+}
+
+Ref<NetworkCacheIOChannel> NetworkCacheIOChannel::open(const String& filePath, NetworkCacheIOChannel::Type type)
+{
+ int oflag;
+ mode_t mode;
+
+ switch (type) {
+ case Type::Create:
+ oflag = O_RDWR | O_CREAT | O_TRUNC | O_NONBLOCK;
+ mode = S_IRUSR | S_IWUSR;
+ break;
+ case Type::Write:
+ oflag = O_WRONLY | O_NONBLOCK;
+ mode = S_IRUSR | S_IWUSR;
+ break;
+ case Type::Read:
+ oflag = O_RDONLY | O_NONBLOCK;
+ mode = 0;
+ }
+
+ CString path = WebCore::fileSystemRepresentation(filePath);
+ int fd = ::open(path.data(), oflag, mode);
+
+ return adoptRef(*new NetworkCacheIOChannel(fd));
+}
+
+void NetworkCacheIOChannel::read(size_t offset, size_t size, std::function<void ( NetworkCacheData&, int error)> completionHandler)
+{
+ RefPtr<NetworkCacheIOChannel> channel(this);
+ bool didCallCompletionHandler = false;
+ dispatch_io_read(m_dispatchIO.get(), offset, size, dispatch_get_main_queue(), [channel, completionHandler, didCallCompletionHandler](bool done, dispatch_data_t fileData, int error) mutable {
+ if (done) {
+ if (!didCallCompletionHandler) {
+ NetworkCacheData nullData;
+ completionHandler(nullData, error);
+ }
+ return;
+ }
+ ASSERT(!didCallCompletionHandler);
+ NetworkCacheData data(fileData);
+ completionHandler(data, error);
+ didCallCompletionHandler = true;
+ });
+}
+
+void NetworkCacheIOChannel::write(size_t offset, const NetworkCacheData& data, std::function<void (int error)> completionHandler)
+{
+ RefPtr<NetworkCacheIOChannel> channel(this);
+ auto dispatchData = data.dispatchData();
+ dispatch_io_write(m_dispatchIO.get(), offset, dispatchData, dispatch_get_main_queue(), [channel, completionHandler](bool done, dispatch_data_t fileData, int error) {
+ ASSERT_UNUSED(done, done);
+ completionHandler(error);
+ });
+}
+
+}
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(NETWORK_CACHE)
</span><span class="cx">
</span><ins>+#include "NetworkCacheData.h"
</ins><span class="cx"> #include "NetworkCacheKey.h"
</span><span class="cx"> #include <wtf/BloomFilter.h>
</span><span class="cx"> #include <wtf/Deque.h>
</span><span class="lines">@@ -46,106 +47,22 @@
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><del>-#if PLATFORM(COCOA)
-template <typename T> class DispatchPtr;
-template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject);
-
-// FIXME: Use OSObjectPtr instead when it works with dispatch_data_t on all platforms.
-template<typename T> class DispatchPtr {
-public:
- DispatchPtr()
- : m_ptr(nullptr)
- {
- }
- DispatchPtr(T ptr)
- : m_ptr(ptr)
- {
- if (m_ptr)
- dispatch_retain(m_ptr);
- }
- DispatchPtr(const DispatchPtr& other)
- : m_ptr(other.m_ptr)
- {
- if (m_ptr)
- dispatch_retain(m_ptr);
- }
- ~DispatchPtr()
- {
- if (m_ptr)
- dispatch_release(m_ptr);
- }
-
- DispatchPtr& operator=(const DispatchPtr& other)
- {
- auto copy = other;
- std::swap(m_ptr, copy.m_ptr);
- return *this;
- }
-
- T get() const { return m_ptr; }
- explicit operator bool() const { return m_ptr; }
-
- friend DispatchPtr adoptDispatch<T>(T);
-
-private:
- struct Adopt { };
- DispatchPtr(Adopt, T data)
- : m_ptr(data)
- {
- }
-
- T m_ptr;
-};
-
-template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject)
-{
- return DispatchPtr<T>(typename DispatchPtr<T>::Adopt { }, dispatchObject);
-}
-#endif
-
</del><span class="cx"> class NetworkCacheStorage {
</span><span class="cx"> WTF_MAKE_NONCOPYABLE(NetworkCacheStorage);
</span><span class="cx"> public:
</span><span class="cx"> static std::unique_ptr<NetworkCacheStorage> open(const String& cachePath);
</span><span class="cx">
</span><del>- class Data {
- public:
- Data() { }
- Data(const uint8_t*, size_t);
-
- enum class Backing { Buffer, Map };
-#if PLATFORM(COCOA)
- explicit Data(DispatchPtr<dispatch_data_t>, Backing = Backing::Buffer);
-#endif
- bool isNull() const;
-
- const uint8_t* data() const;
- size_t size() const { return m_size; }
- bool isMap() const { return m_isMap; }
-
-#if PLATFORM(COCOA)
- dispatch_data_t dispatchData() const { return m_dispatchData.get(); }
-#endif
- private:
-#if PLATFORM(COCOA)
- mutable DispatchPtr<dispatch_data_t> m_dispatchData;
-#endif
- mutable const uint8_t* m_data { nullptr };
- size_t m_size { 0 };
- bool m_isMap { false };
- };
-
</del><span class="cx"> struct Entry {
</span><span class="cx"> NetworkCacheKey key;
</span><span class="cx"> std::chrono::milliseconds timeStamp;
</span><del>- Data header;
- Data body;
</del><ins>+ NetworkCacheData header;
+ NetworkCacheData body;
</ins><span class="cx"> };
</span><span class="cx"> // This may call completion handler synchronously on failure.
</span><span class="cx"> typedef std::function<bool (std::unique_ptr<Entry>)> RetrieveCompletionHandler;
</span><span class="cx"> void retrieve(const NetworkCacheKey&, unsigned priority, RetrieveCompletionHandler&&);
</span><span class="cx">
</span><del>- typedef std::function<void (bool success, const Data& mappedBody)> StoreCompletionHandler;
</del><ins>+ typedef std::function<void (bool success, const NetworkCacheData& mappedBody)> StoreCompletionHandler;
</ins><span class="cx"> void store(const Entry&, StoreCompletionHandler&&);
</span><span class="cx"> void update(const Entry& updateEntry, const Entry& existingEntry, StoreCompletionHandler&&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "NetworkCacheCoders.h"
</span><span class="cx"> #include "NetworkCacheFileSystemPosix.h"
</span><ins>+#include "NetworkCacheIOChannel.h"
</ins><span class="cx"> #include <dispatch/dispatch.h>
</span><span class="cx"> #include <mach/vm_param.h>
</span><span class="cx"> #include <sys/mman.h>
</span><span class="lines">@@ -49,39 +50,6 @@
</span><span class="cx"> static const char networkCacheSubdirectory[] = "WebKitCache";
</span><span class="cx"> static const char versionDirectoryPrefix[] = "Version ";
</span><span class="cx">
</span><del>-NetworkCacheStorage::Data::Data(const uint8_t* data, size_t size)
- : m_dispatchData(adoptDispatch(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))
- , m_size(size)
-{
-}
-
-NetworkCacheStorage::Data::Data(DispatchPtr<dispatch_data_t> dispatchData, Backing backing)
-{
- if (!dispatchData)
- return;
- const void* data;
- m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &data, &m_size));
- m_data = static_cast<const uint8_t*>(data);
- m_isMap = m_size && backing == Backing::Map;
-}
-
-const uint8_t* NetworkCacheStorage::Data::data() const
-{
- if (!m_data) {
- const void* data;
- size_t size;
- m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &data, &size));
- ASSERT(size == m_size);
- m_data = static_cast<const uint8_t*>(data);
- }
- return m_data;
-}
-
-bool NetworkCacheStorage::Data::isNull() const
-{
- return !m_dispatchData;
-}
-
</del><span class="cx"> std::unique_ptr<NetworkCacheStorage> NetworkCacheStorage::open(const String& cachePath)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(RunLoop::isMain());
</span><span class="lines">@@ -150,49 +118,15 @@
</span><span class="cx"> return WebCore::pathByAppendingComponent(directoryPathForKey(key, cachePath), fileNameForKey(key));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-enum class FileOpenType { Read, Write, Create };
-static DispatchPtr<dispatch_io_t> openFile(const String& fileName, const String& directoryPath, FileOpenType type, int& fd)
</del><ins>+static Ref<NetworkCacheIOChannel> openFileForKey(const NetworkCacheKey& key, NetworkCacheIOChannel::Type type, const String& cachePath)
</ins><span class="cx"> {
</span><del>- int oflag;
- mode_t mode;
-
- switch (type) {
- case FileOpenType::Create:
- oflag = O_RDWR | O_CREAT | O_TRUNC | O_NONBLOCK;
- mode = S_IRUSR | S_IWUSR;
</del><ins>+ auto directoryPath = directoryPathForKey(key, cachePath);
+ auto filePath = WebCore::pathByAppendingComponent(directoryPath, fileNameForKey(key));
+ if (type == NetworkCacheIOChannel::Type::Create)
</ins><span class="cx"> WebCore::makeAllDirectories(directoryPath);
</span><del>- break;
- case FileOpenType::Write:
- oflag = O_WRONLY | O_NONBLOCK;
- mode = S_IRUSR | S_IWUSR;
- break;
- case FileOpenType::Read:
- oflag = O_RDONLY | O_NONBLOCK;
- mode = 0;
- }
-
- CString path = WebCore::fileSystemRepresentation(WebCore::pathByAppendingComponent(directoryPath, fileName));
- fd = ::open(path.data(), oflag, mode);
-
- LOG(NetworkCacheStorage, "(NetworkProcess) opening %s type=%d", path.data(), type);
-
- auto channel = adoptDispatch(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd, type](int error) {
- close(fd);
- if (error)
- LOG(NetworkCacheStorage, "(NetworkProcess) error creating io channel %d", error);
- }));
-
- ASSERT(channel);
- dispatch_io_set_low_water(channel.get(), std::numeric_limits<size_t>::max());
-
- return channel;
</del><ins>+ return NetworkCacheIOChannel::open(filePath, type);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static DispatchPtr<dispatch_io_t> openFileForKey(const NetworkCacheKey& key, FileOpenType type, const String& cachePath, int& fd)
-{
- return openFile(fileNameForKey(key), directoryPathForKey(key, cachePath), type, fd);
-}
-
</del><span class="cx"> static unsigned hashData(dispatch_data_t data)
</span><span class="cx"> {
</span><span class="cx"> if (!data || !dispatch_data_get_size(data))
</span><span class="lines">@@ -220,10 +154,10 @@
</span><span class="cx"> uint64_t bodySize;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static bool decodeEntryMetaData(EntryMetaData& metaData, dispatch_data_t fileData)
</del><ins>+static bool decodeEntryMetaData(EntryMetaData& metaData, const NetworkCacheData& fileData)
</ins><span class="cx"> {
</span><span class="cx"> bool success = false;
</span><del>- dispatch_data_apply(fileData, [&metaData, &success](dispatch_data_t, size_t, const void* data, size_t size) {
</del><ins>+ dispatch_data_apply(fileData.dispatchData(), [&metaData, &success](dispatch_data_t, size_t, const void* data, size_t size) {
</ins><span class="cx"> NetworkCacheDecoder decoder(reinterpret_cast<const uint8_t*>(data), size);
</span><span class="cx"> if (!decoder.decode(metaData.cacheStorageVersion))
</span><span class="cx"> return false;
</span><span class="lines">@@ -260,7 +194,7 @@
</span><span class="cx"> return bodyMap;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static bool decodeEntryHeader(dispatch_data_t fileData, EntryMetaData& metaData, NetworkCacheStorage::Data& data)
</del><ins>+static bool decodeEntryHeader(const NetworkCacheData& fileData, EntryMetaData& metaData, NetworkCacheData& data)
</ins><span class="cx"> {
</span><span class="cx"> if (!decodeEntryMetaData(metaData, fileData))
</span><span class="cx"> return false;
</span><span class="lines">@@ -269,25 +203,25 @@
</span><span class="cx"> if (metaData.headerOffset + metaData.headerSize > metaData.bodyOffset)
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData, metaData.headerOffset, metaData.headerSize));
</del><ins>+ auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData.dispatchData(), metaData.headerOffset, metaData.headerSize));
</ins><span class="cx"> if (metaData.headerChecksum != hashData(headerData.get())) {
</span><span class="cx"> LOG(NetworkCacheStorage, "(NetworkProcess) header checksum mismatch");
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><del>- data = NetworkCacheStorage::Data { headerData };
</del><ins>+ data = { headerData };
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static std::unique_ptr<NetworkCacheStorage::Entry> decodeEntry(dispatch_data_t fileData, int fd, const NetworkCacheKey& key)
</del><ins>+static std::unique_ptr<NetworkCacheStorage::Entry> decodeEntry(const NetworkCacheData& fileData, int fd, const NetworkCacheKey& key)
</ins><span class="cx"> {
</span><span class="cx"> EntryMetaData metaData;
</span><del>- NetworkCacheStorage::Data headerData;
</del><ins>+ NetworkCacheData headerData;
</ins><span class="cx"> if (!decodeEntryHeader(fileData, metaData, headerData))
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> if (metaData.key != key)
</span><span class="cx"> return nullptr;
</span><del>- if (metaData.bodyOffset + metaData.bodySize != dispatch_data_get_size(fileData))
</del><ins>+ if (metaData.bodyOffset + metaData.bodySize != fileData.size())
</ins><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> auto bodyData = mapFile(fd, metaData.bodyOffset, metaData.bodySize);
</span><span class="lines">@@ -305,7 +239,7 @@
</span><span class="cx"> metaData.key,
</span><span class="cx"> metaData.timeStamp,
</span><span class="cx"> headerData,
</span><del>- NetworkCacheStorage::Data { bodyData, NetworkCacheStorage::Data::Backing::Map }
</del><ins>+ { bodyData, NetworkCacheData::Backing::Map }
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -326,7 +260,7 @@
</span><span class="cx"> return adoptDispatch(dispatch_data_create(encoder.buffer(), encoder.bufferSize(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static DispatchPtr<dispatch_data_t> encodeEntryHeader(const NetworkCacheStorage::Entry& entry)
</del><ins>+static NetworkCacheData encodeEntryHeader(const NetworkCacheStorage::Entry& entry)
</ins><span class="cx"> {
</span><span class="cx"> EntryMetaData metaData(entry.key);
</span><span class="cx"> metaData.timeStamp = entry.timeStamp;
</span><span class="lines">@@ -338,13 +272,13 @@
</span><span class="cx"> auto encodedMetaData = encodeEntryMetaData(metaData);
</span><span class="cx"> auto headerData = adoptDispatch(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData()));
</span><span class="cx"> if (!entry.body.size())
</span><del>- return headerData;
</del><ins>+ return { headerData };
</ins><span class="cx">
</span><span class="cx"> size_t headerSize = dispatch_data_get_size(headerData.get());
</span><span class="cx"> size_t dataOffset = round_page(headerSize);
</span><span class="cx"> Vector<uint8_t, 4096> filler(dataOffset - headerSize, 0);
</span><span class="cx"> auto alignmentData = adoptDispatch(dispatch_data_create(filler.data(), filler.size(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));
</span><del>- return adoptDispatch(dispatch_data_create_concat(headerData.get(), alignmentData.get()));
</del><ins>+ return { adoptDispatch(dispatch_data_create_concat(headerData.get(), alignmentData.get())) };
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkCacheStorage::removeEntry(const NetworkCacheKey& key)
</span><span class="lines">@@ -370,30 +304,25 @@
</span><span class="cx">
</span><span class="cx"> StringCapture cachePathCapture(m_directoryPath);
</span><span class="cx"> dispatch_async(m_ioQueue.get(), [this, &read, cachePathCapture] {
</span><del>- int fd;
- auto channel = openFileForKey(read.key, FileOpenType::Read, cachePathCapture.string(), fd);
</del><ins>+ auto channel = openFileForKey(read.key, NetworkCacheIOChannel::Type::Read, cachePathCapture.string());
+ int fd = channel->fileDescriptor();
</ins><span class="cx">
</span><del>- bool didCallCompletionHandler = false;
- dispatch_io_read(channel.get(), 0, std::numeric_limits<size_t>::max(), dispatch_get_main_queue(), [this, fd, &read, didCallCompletionHandler](bool done, dispatch_data_t fileData, int error) mutable {
- if (done) {
- if (error)
</del><ins>+ channel->read(0, std::numeric_limits<size_t>::max(), [this, &read, fd](NetworkCacheData& fileData, int error) {
+ if (error) {
+ removeEntry(read.key);
+ read.completionHandler(nullptr);
+ } else {
+ auto entry = decodeEntry(fileData, fd, read.key);
+ bool success = read.completionHandler(WTF::move(entry));
+ if (!success)
</ins><span class="cx"> removeEntry(read.key);
</span><del>-
- if (!didCallCompletionHandler)
- read.completionHandler(nullptr);
-
- ASSERT(m_activeReadOperations.contains(&read));
- m_activeReadOperations.remove(&read);
- dispatchPendingReadOperations();
- return;
</del><span class="cx"> }
</span><del>- ASSERT(!didCallCompletionHandler); // We are requesting maximum sized chunk so we should never get called more than once with data.
</del><span class="cx">
</span><del>- auto entry = decodeEntry(fileData, fd, read.key);
- bool success = read.completionHandler(WTF::move(entry));
- didCallCompletionHandler = true;
- if (!success)
- removeEntry(read.key);
</del><ins>+ ASSERT(m_activeReadOperations.contains(&read));
+ m_activeReadOperations.remove(&read);
+ dispatchPendingReadOperations();
+
+ LOG(NetworkCacheStorage, "(NetworkProcess) read complete error=%d", error);
</ins><span class="cx"> });
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -465,7 +394,7 @@
</span><span class="cx"> ASSERT(!entry.key.isNull());
</span><span class="cx">
</span><span class="cx"> if (!m_maximumSize) {
</span><del>- completionHandler(false, Data());
</del><ins>+ completionHandler(false, { });
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -484,7 +413,7 @@
</span><span class="cx"> ASSERT(existingEntry.key == updateEntry.key);
</span><span class="cx">
</span><span class="cx"> if (!m_maximumSize) {
</span><del>- completionHandler(false, Data());
</del><ins>+ completionHandler(false, { });
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -500,18 +429,17 @@
</span><span class="cx"> String cachePath = cachePathCapture.string();
</span><span class="cx"> auto semaphore = adoptDispatch(dispatch_semaphore_create(0));
</span><span class="cx"> traverseCacheFiles(cachePath, [this, &semaphore, &traverseHandler](const String& fileName, const String& partitionPath) {
</span><del>- int fd;
- auto channel = openFile(fileName, partitionPath, FileOpenType::Read, fd);
</del><ins>+ auto filePath = WebCore::pathByAppendingComponent(partitionPath, fileName);
+ auto channel = NetworkCacheIOChannel::open(filePath, NetworkCacheIOChannel::Type::Read);
</ins><span class="cx"> const size_t headerReadSize = 16 << 10;
</span><del>- dispatch_io_read(channel.get(), 0, headerReadSize, dispatch_get_main_queue(), [this, fd, &semaphore, &traverseHandler](bool done, dispatch_data_t fileData, int) {
</del><ins>+ channel->read(0, headerReadSize, [this, &semaphore, &traverseHandler](NetworkCacheData& fileData, int) {
</ins><span class="cx"> EntryMetaData metaData;
</span><del>- NetworkCacheStorage::Data headerData;
</del><ins>+ NetworkCacheData headerData;
</ins><span class="cx"> if (decodeEntryHeader(fileData, metaData, headerData)) {
</span><del>- Entry entry { metaData.key, metaData.timeStamp, headerData, Data() };
</del><ins>+ Entry entry { metaData.key, metaData.timeStamp, headerData, { } };
</ins><span class="cx"> traverseHandler(&entry);
</span><span class="cx"> }
</span><del>- if (done)
- dispatch_semaphore_signal(semaphore.get());
</del><ins>+ dispatch_semaphore_signal(semaphore.get());
</ins><span class="cx"> });
</span><span class="cx"> dispatch_semaphore_wait(semaphore.get(), DISPATCH_TIME_FOREVER);
</span><span class="cx"> });
</span><span class="lines">@@ -555,14 +483,15 @@
</span><span class="cx"> StringCapture cachePathCapture(m_directoryPath);
</span><span class="cx"> dispatch_async(m_backgroundIOQueue.get(), [this, &write, cachePathCapture] {
</span><span class="cx"> auto encodedHeader = encodeEntryHeader(write.entry);
</span><del>- auto writeData = adoptDispatch(dispatch_data_create_concat(encodedHeader.get(), write.entry.body.dispatchData()));
</del><ins>+ auto headerAndBodyData = adoptDispatch(dispatch_data_create_concat(encodedHeader.dispatchData(), write.entry.body.dispatchData()));
</ins><span class="cx">
</span><del>- size_t bodyOffset = dispatch_data_get_size(encodedHeader.get());
</del><ins>+ NetworkCacheData writeData(headerAndBodyData);
</ins><span class="cx">
</span><del>- int fd;
- auto channel = openFileForKey(write.entry.key, FileOpenType::Create, cachePathCapture.string(), fd);
- dispatch_io_write(channel.get(), 0, writeData.get(), dispatch_get_main_queue(), [this, &write, fd, bodyOffset](bool done, dispatch_data_t, int error) {
- ASSERT_UNUSED(done, done);
</del><ins>+ auto channel = openFileForKey(write.entry.key, NetworkCacheIOChannel::Type::Create, cachePathCapture.string());
+ int fd = channel->fileDescriptor();
+ size_t bodyOffset = encodedHeader.size();
+
+ channel->write(0, writeData, [this, &write, bodyOffset, fd](int error) {
</ins><span class="cx"> LOG(NetworkCacheStorage, "(NetworkProcess) write complete error=%d", error);
</span><span class="cx"> if (error) {
</span><span class="cx"> if (m_contentsFilter.mayContain(write.entry.key.shortHash()))
</span><span class="lines">@@ -576,7 +505,7 @@
</span><span class="cx"> bool shouldMapBody = !error && bodySize >= vm_page_size;
</span><span class="cx"> auto bodyMap = shouldMapBody ? mapFile(fd, bodyOffset, bodySize) : nullptr;
</span><span class="cx">
</span><del>- Data bodyData(bodyMap, Data::Backing::Map);
</del><ins>+ NetworkCacheData bodyData(bodyMap, NetworkCacheData::Backing::Map);
</ins><span class="cx"> write.completionHandler(!error, bodyData);
</span><span class="cx">
</span><span class="cx"> ASSERT(m_activeWriteOperations.contains(&write));
</span><span class="lines">@@ -601,7 +530,7 @@
</span><span class="cx"> auto headerData = encodeEntryHeader(write.entry);
</span><span class="cx"> auto existingHeaderData = encodeEntryHeader(write.existingEntry.value());
</span><span class="cx">
</span><del>- bool pageRoundedHeaderSizeChanged = dispatch_data_get_size(headerData.get()) != dispatch_data_get_size(existingHeaderData.get());
</del><ins>+ bool pageRoundedHeaderSizeChanged = headerData.size() != existingHeaderData.size();
</ins><span class="cx"> if (pageRoundedHeaderSizeChanged) {
</span><span class="cx"> LOG(NetworkCacheStorage, "(NetworkProcess) page-rounded header size changed, storing full entry");
</span><span class="cx"> dispatch_async(dispatch_get_main_queue(), [this, &write] {
</span><span class="lines">@@ -610,16 +539,14 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- int fd;
- auto channel = openFileForKey(write.entry.key, FileOpenType::Write, cachePathCapture.string(), fd);
- dispatch_io_write(channel.get(), 0, headerData.get(), dispatch_get_main_queue(), [this, &write](bool done, dispatch_data_t, int error) {
- ASSERT_UNUSED(done, done);
</del><ins>+ auto channel = openFileForKey(write.entry.key, NetworkCacheIOChannel::Type::Write, cachePathCapture.string());
+ channel->write(0, headerData, [this, &write](int error) {
</ins><span class="cx"> LOG(NetworkCacheStorage, "(NetworkProcess) update complete error=%d", error);
</span><span class="cx">
</span><span class="cx"> if (error)
</span><span class="cx"> removeEntry(write.entry.key);
</span><span class="cx">
</span><del>- write.completionHandler(!error, Data());
</del><ins>+ write.completionHandler(!error, { });
</ins><span class="cx">
</span><span class="cx"> ASSERT(m_activeWriteOperations.contains(&write));
</span><span class="cx"> m_activeWriteOperations.remove(&write);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -1753,6 +1753,10 @@
</span><span class="cx">                 E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */; };
</span><span class="cx">                 E1EE53E311F8CFC000CCBEE4 /* InjectedBundlePageEditorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E1EE53DC11F8CF9F00CCBEE4 /* InjectedBundlePageEditorClient.h */; };
</span><span class="cx">                 E1EE53E711F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */; };
</span><ins>+                E42E060F1AA7523400B11699 /* NetworkCacheIOChannelCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */; };
+                E42E06101AA7523B00B11699 /* NetworkCacheIOChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */; };
+                E42E06121AA75ABD00B11699 /* NetworkCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E06111AA75ABD00B11699 /* NetworkCacheData.h */; };
+                E42E06141AA75B7000B11699 /* NetworkCacheDataCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42E06131AA75B7000B11699 /* NetworkCacheDataCocoa.mm */; };
</ins><span class="cx">                 E4436ECA1A0D03FA00EAD204 /* NetworkCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4436EBE1A0CFDB200EAD204 /* NetworkCache.cpp */; };
</span><span class="cx">                 E4436ECC1A0D040B00EAD204 /* NetworkCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E4436EBF1A0CFDB200EAD204 /* NetworkCache.h */; };
</span><span class="cx">                 E4436ECD1A0D040B00EAD204 /* NetworkCacheKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4436EC01A0CFDB200EAD204 /* NetworkCacheKey.cpp */; };
</span><span class="lines">@@ -3985,6 +3989,10 @@
</span><span class="cx">                 E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageEditorClient.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 E1FEF39A190F76F300731658 /* com.apple.WebKit.Databases.sb.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = com.apple.WebKit.Databases.sb.in; sourceTree = "<group>"; };
</span><span class="cx">                 E1FEF39C190F791C00731658 /* DatabaseProcessIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DatabaseProcessIOS.mm; sourceTree = "<group>"; };
</span><ins>+                E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheIOChannel.h; sourceTree = "<group>"; };
+                E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkCacheIOChannelCocoa.mm; sourceTree = "<group>"; };
+                E42E06111AA75ABD00B11699 /* NetworkCacheData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheData.h; sourceTree = "<group>"; };
+                E42E06131AA75B7000B11699 /* NetworkCacheDataCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkCacheDataCocoa.mm; sourceTree = "<group>"; };
</ins><span class="cx">                 E4436EBE1A0CFDB200EAD204 /* NetworkCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCache.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 E4436EBF1A0CFDB200EAD204 /* NetworkCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCache.h; sourceTree = "<group>"; };
</span><span class="cx">                 E4436EC01A0CFDB200EAD204 /* NetworkCacheKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheKey.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -7417,11 +7425,15 @@
</span><span class="cx">                                 E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */,
</span><span class="cx">                                 E489D2841A0A2DB80078C06A /* NetworkCacheCoders.cpp */,
</span><span class="cx">                                 E489D2851A0A2DB80078C06A /* NetworkCacheCoders.h */,
</span><ins>+                                E42E06111AA75ABD00B11699 /* NetworkCacheData.h */,
+                                E42E06131AA75B7000B11699 /* NetworkCacheDataCocoa.mm */,
</ins><span class="cx">                                 E489D2861A0A2DB80078C06A /* NetworkCacheDecoder.cpp */,
</span><span class="cx">                                 E489D2871A0A2DB80078C06A /* NetworkCacheDecoder.h */,
</span><span class="cx">                                 E489D2881A0A2DB80078C06A /* NetworkCacheEncoder.cpp */,
</span><span class="cx">                                 E489D2891A0A2DB80078C06A /* NetworkCacheEncoder.h */,
</span><span class="cx">                                 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h */,
</span><ins>+                                E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */,
+                                E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */,
</ins><span class="cx">                                 E4436EC01A0CFDB200EAD204 /* NetworkCacheKey.cpp */,
</span><span class="cx">                                 E4436EC11A0CFDB200EAD204 /* NetworkCacheKey.h */,
</span><span class="cx">                                 834B25101A842C8700CFB150 /* NetworkCacheStatistics.h */,
</span><span class="lines">@@ -7536,6 +7548,7 @@
</span><span class="cx">                                 3769079A18F31CB2001DFF04 /* APIInjectedBundlePageUIClient.h in Headers */,
</span><span class="cx">                                 7C89D2B61A6B0DD9003A5FDE /* WKUserContentControllerPrivate.h in Headers */,
</span><span class="cx">                                 7CE4D2071A46776100C7F152 /* APILegacyContextHistoryClient.h in Headers */,
</span><ins>+                                E42E06121AA75ABD00B11699 /* NetworkCacheData.h in Headers */,
</ins><span class="cx">                                 1A2464F31891E45100234C5B /* APILoaderClient.h in Headers */,
</span><span class="cx">                                 7CD3A4831A5D02FA009623B8 /* APINavigation.h in Headers */,
</span><span class="cx">                                 BCF69FA21176D01400471A52 /* APINavigationData.h in Headers */,
</span><span class="lines">@@ -7849,6 +7862,7 @@
</span><span class="cx">                                 51654F00184EF34A007DC837 /* UniqueIDBDatabaseBackingStore.h in Headers */,
</span><span class="cx">                                 51654EFE184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.h in Headers */,
</span><span class="cx">                                 515E773418402D510007203F /* UniqueIDBDatabaseIdentifier.h in Headers */,
</span><ins>+                                E42E06101AA7523B00B11699 /* NetworkCacheIOChannel.h in Headers */,
</ins><span class="cx">                                 1A64245E12DE29A100CAAE2C /* UpdateInfo.h in Headers */,
</span><span class="cx">                                 1AC1336818565B5700F3EC05 /* UserData.h in Headers */,
</span><span class="cx">                                 4A3CC18B19B0640F00D14AEF /* UserMediaPermissionRequestManagerProxy.h in Headers */,
</span><span class="lines">@@ -9607,6 +9621,7 @@
</span><span class="cx">                                 296BD85E15019BC30071F424 /* StringUtilities.mm in Sources */,
</span><span class="cx">                                 1ZZ417EF12C00D87002BE67B /* TextCheckerCompletion.cpp in Sources */,
</span><span class="cx">                                 2DA944AD1884E9BA00ED86DB /* TextCheckerIOS.mm in Sources */,
</span><ins>+                                E42E06141AA75B7000B11699 /* NetworkCacheDataCocoa.mm in Sources */,
</ins><span class="cx">                                 1AA417EF12C00D87002BE67B /* TextCheckerMac.mm in Sources */,
</span><span class="cx">                                 1AAF263814687C39004A1E8A /* TiledCoreAnimationDrawingArea.mm in Sources */,
</span><span class="cx">                                 1AF05D8614688348008B1E81 /* TiledCoreAnimationDrawingAreaProxy.mm in Sources */,
</span><span class="lines">@@ -9854,6 +9869,7 @@
</span><span class="cx">                                 2D0730A219F9C7DA00E9D9C4 /* WKActionMenuController.mm in Sources */,
</span><span class="cx">                                 0FCB4E4918BBE044000FCFC9 /* WKActionSheet.mm in Sources */,
</span><span class="cx">                                 0FCB4E4B18BBE044000FCFC9 /* WKActionSheetAssistant.mm in Sources */,
</span><ins>+                                E42E060F1AA7523400B11699 /* NetworkCacheIOChannelCocoa.mm in Sources */,
</ins><span class="cx">                                 C5FA1ED418E1062200B3F402 /* WKAirPlayRoutePicker.mm in Sources */,
</span><span class="cx">                                 512E34E4130B4D0500ABD19A /* WKApplicationCacheManager.cpp in Sources */,
</span><span class="cx">                                 BC4075F3124FF0270068F20A /* WKArray.cpp in Sources */,
</span></span></pre>
</div>
</div>
</body>
</html>