Changeset 181160 in webkit
- Timestamp:
- Mar 6, 2015 9:25:54 AM (9 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r181158 r181160 1 2015-03-06 Antti Koivisto <antti@apple.com> 2 3 Move dispatch_data use behind NetworkCache::Data abstraction 4 https://bugs.webkit.org/show_bug.cgi?id=142392 5 6 Reviewed by Anders Carlsson. 7 8 * NetworkProcess/cache/NetworkCacheData.h: 9 (WebKit::NetworkCache::DispatchPtr::DispatchPtr): 10 * NetworkProcess/cache/NetworkCacheDataCocoa.mm: 11 (WebKit::NetworkCache::Data::Data): 12 (WebKit::NetworkCache::Data::apply): 13 (WebKit::NetworkCache::Data::subrange): 14 (WebKit::NetworkCache::concatenate): 15 (WebKit::NetworkCache::mapFile): 16 * NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm: 17 (WebKit::NetworkCache::IOChannel::read): 18 * NetworkProcess/cache/NetworkCacheStorageCocoa.mm: 19 (WebKit::NetworkCache::hashData): 20 (WebKit::NetworkCache::decodeEntryMetaData): 21 (WebKit::NetworkCache::decodeEntryHeader): 22 (WebKit::NetworkCache::decodeEntry): 23 (WebKit::NetworkCache::encodeEntryMetaData): 24 (WebKit::NetworkCache::encodeEntryHeader): 25 (WebKit::NetworkCache::Storage::dispatchFullWriteOperation): 26 (WebKit::NetworkCache::mapFile): Deleted. 27 1 28 2015-03-06 Antti Koivisto <antti@apple.com> 2 29 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h
r181140 r181160 48 48 { 49 49 } 50 DispatchPtr(T ptr)50 explicit DispatchPtr(T ptr) 51 51 : m_ptr(ptr) 52 52 { … … 109 109 bool isMap() const { return m_isMap; } 110 110 111 Data subrange(size_t offset, size_t) const; 112 113 bool apply(const std::function<bool (const uint8_t*, size_t)>&&) const; 114 111 115 #if PLATFORM(COCOA) 112 116 dispatch_data_t dispatchData() const { return m_dispatchData.get(); } … … 121 125 }; 122 126 127 Data concatenate(const Data&, const Data&); 128 Data mapFile(int fd, size_t offset, size_t); 129 123 130 } 124 131 } -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm
r181140 r181160 30 30 31 31 #include <dispatch/dispatch.h> 32 #include <sys/mman.h> 32 33 33 34 namespace WebKit { … … 41 42 42 43 Data::Data(DispatchPtr<dispatch_data_t> dispatchData, Backing backing) 44 : m_dispatchData(dispatchData) 45 , m_size(m_dispatchData ? dispatch_data_get_size(m_dispatchData.get()) : 0) 46 , m_isMap(m_size && backing == Backing::Map) 43 47 { 44 if (!dispatchData)45 return;46 const void* data;47 m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &data, &m_size));48 m_data = static_cast<const uint8_t*>(data);49 m_isMap = m_size && backing == Backing::Map;50 48 } 51 49 … … 67 65 } 68 66 67 bool Data::apply(const std::function<bool (const uint8_t*, size_t)>&& applier) const 68 { 69 if (!m_size) 70 return false; 71 return dispatch_data_apply(m_dispatchData.get(), [&applier](dispatch_data_t, size_t, const void* data, size_t size) { 72 return applier(static_cast<const uint8_t*>(data), size); 73 }); 74 } 75 76 Data Data::subrange(size_t offset, size_t size) const 77 { 78 return { adoptDispatch(dispatch_data_create_subrange(dispatchData(), offset, size)) }; 79 } 80 81 Data concatenate(const Data& a, const Data& b) 82 { 83 if (a.isNull()) 84 return b; 85 if (b.isNull()) 86 return a; 87 return { adoptDispatch(dispatch_data_create_concat(a.dispatchData(), b.dispatchData())) }; 88 } 89 90 Data mapFile(int fd, size_t offset, size_t size) 91 { 92 void* map = mmap(nullptr, size, PROT_READ, MAP_PRIVATE, fd, offset); 93 if (map == MAP_FAILED) 94 return { }; 95 auto bodyMap = adoptDispatch(dispatch_data_create(map, size, dispatch_get_main_queue(), [map, size] { 96 munmap(map, size); 97 })); 98 return { bodyMap, Data::Backing::Map }; 99 } 100 69 101 } 70 102 } -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm
r181140 r181160 89 89 } 90 90 ASSERT(!didCallCompletionHandler); 91 Data data(fileData); 91 DispatchPtr<dispatch_data_t> fileDataPtr(fileData); 92 Data data(fileDataPtr); 92 93 completionHandler(data, error); 93 94 didCallCompletionHandler = true; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm
r181158 r181160 34 34 #include "NetworkCacheIOChannel.h" 35 35 #include <dispatch/dispatch.h> 36 #include <mach/vm_param.h>37 #include <sys/mman.h>38 #include <sys/stat.h>39 36 #include <wtf/PageBlock.h> 40 37 #include <wtf/RandomNumber.h> … … 124 121 } 125 122 126 static unsigned hashData(dispatch_data_t data) 127 { 128 if (!data || !dispatch_data_get_size(data)) 129 return 0; 123 static unsigned hashData(const Data& data) 124 { 130 125 StringHasher hasher; 131 d ispatch_data_apply(data, [&hasher](dispatch_data_t, size_t, const void* data, size_t size) {132 hasher.addCharacters( static_cast<const uint8_t*>(data), size);126 data.apply([&hasher](const uint8_t* data, size_t size) { 127 hasher.addCharacters(data, size); 133 128 return true; 134 129 }); … … 157 152 { 158 153 bool success = false; 159 dispatch_data_apply(fileData.dispatchData(), [&metaData, &success](dispatch_data_t, size_t, const void* data, size_t size) {160 Decoder decoder( reinterpret_cast<const uint8_t*>(data), size);154 fileData.apply([&metaData, &success](const uint8_t* data, size_t size) { 155 Decoder decoder(data, size); 161 156 if (!decoder.decode(metaData.cacheStorageVersion)) 162 157 return false; … … 181 176 }); 182 177 return success; 183 }184 185 static DispatchPtr<dispatch_data_t> mapFile(int fd, size_t offset, size_t size)186 {187 void* map = mmap(nullptr, size, PROT_READ, MAP_PRIVATE, fd, offset);188 if (map == MAP_FAILED)189 return nullptr;190 auto bodyMap = adoptDispatch(dispatch_data_create(map, size, dispatch_get_main_queue(), [map, size] {191 munmap(map, size);192 }));193 return bodyMap;194 178 } 195 179 … … 203 187 return false; 204 188 205 auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData.dispatchData(), metaData.headerOffset, metaData.headerSize));206 if (metaData.headerChecksum != hashData(headerData .get())) {189 auto headerData = fileData.subrange(metaData.headerOffset, metaData.headerSize); 190 if (metaData.headerChecksum != hashData(headerData)) { 207 191 LOG(NetworkCacheStorage, "(NetworkProcess) header checksum mismatch"); 208 192 return false; … … 225 209 226 210 auto bodyData = mapFile(fd, metaData.bodyOffset, metaData.bodySize); 227 if ( !bodyData) {211 if (bodyData.isNull()) { 228 212 LOG(NetworkCacheStorage, "(NetworkProcess) map failed"); 229 213 return nullptr; 230 214 } 231 215 232 if (metaData.bodyChecksum != hashData(bodyData .get())) {216 if (metaData.bodyChecksum != hashData(bodyData)) { 233 217 LOG(NetworkCacheStorage, "(NetworkProcess) data checksum mismatch"); 234 218 return nullptr; 235 219 } 236 220 237 return std:: unique_ptr<Storage::Entry>(newStorage::Entry {221 return std::make_unique<Storage::Entry>(Storage::Entry { 238 222 metaData.key, 239 223 metaData.timeStamp, 240 224 headerData, 241 { bodyData, Data::Backing::Map }242 }); 243 } 244 245 static D ispatchPtr<dispatch_data_t>encodeEntryMetaData(const EntryMetaData& entry)225 bodyData 226 }); 227 } 228 229 static Data encodeEntryMetaData(const EntryMetaData& entry) 246 230 { 247 231 Encoder encoder; … … 257 241 encoder.encodeChecksum(); 258 242 259 return adoptDispatch(dispatch_data_create(encoder.buffer(), encoder.bufferSize(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));243 return Data(encoder.buffer(), encoder.bufferSize()); 260 244 } 261 245 … … 264 248 EntryMetaData metaData(entry.key); 265 249 metaData.timeStamp = entry.timeStamp; 266 metaData.headerChecksum = hashData(entry.header .dispatchData());250 metaData.headerChecksum = hashData(entry.header); 267 251 metaData.headerSize = entry.header.size(); 268 metaData.bodyChecksum = hashData(entry.body .dispatchData());252 metaData.bodyChecksum = hashData(entry.body); 269 253 metaData.bodySize = entry.body.size(); 270 254 271 255 auto encodedMetaData = encodeEntryMetaData(metaData); 272 auto headerData = adoptDispatch(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData()));256 auto headerData = concatenate(encodedMetaData, entry.header); 273 257 if (!entry.body.size()) 274 258 return { headerData }; 275 259 276 size_t headerSize = dispatch_data_get_size(headerData.get());277 size_t dataOffset = round_page(headerSize);278 Vector<uint8_t, 4096> filler(dataOffset - headerSize, 0);279 auto alignmentData = adoptDispatch(dispatch_data_create(filler.data(), filler.size(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)); 280 return { adoptDispatch(dispatch_data_create_concat(headerData.get(), alignmentData.get())) };260 size_t dataOffset = WTF::roundUpToMultipleOf(pageSize(), headerData.size()); 261 Vector<uint8_t, 4096> filler(dataOffset - headerData.size(), 0); 262 Data alignmentData(filler.data(), filler.size()); 263 264 return concatenate(headerData, alignmentData); 281 265 } 282 266 … … 482 466 backgroundIOQueue().dispatch([this, &write, cachePathCapture] { 483 467 auto encodedHeader = encodeEntryHeader(write.entry); 484 auto headerAndBodyData = adoptDispatch(dispatch_data_create_concat(encodedHeader.dispatchData(), write.entry.body.dispatchData())); 485 486 Data writeData(headerAndBodyData); 468 auto headerAndBodyData = concatenate(encodedHeader, write.entry.body); 487 469 488 470 auto channel = openFileForKey(write.entry.key, IOChannel::Type::Create, cachePathCapture.string()); … … 490 472 size_t bodyOffset = encodedHeader.size(); 491 473 492 channel->write(0, writeData, [this, &write, bodyOffset, fd](int error) {474 channel->write(0, headerAndBodyData, [this, &write, bodyOffset, fd](int error) { 493 475 LOG(NetworkCacheStorage, "(NetworkProcess) write complete error=%d", error); 494 476 if (error) { … … 502 484 503 485 bool shouldMapBody = !error && bodySize >= pageSize(); 504 auto bodyMap = shouldMapBody ? mapFile(fd, bodyOffset, bodySize) : nullptr; 505 506 Data bodyData(bodyMap, Data::Backing::Map); 507 write.completionHandler(!error, bodyData); 486 auto bodyMap = shouldMapBody ? mapFile(fd, bodyOffset, bodySize) : Data(); 487 488 write.completionHandler(!error, bodyMap); 508 489 509 490 ASSERT(m_activeWriteOperations.contains(&write));
Note: See TracChangeset
for help on using the changeset viewer.