Changeset 182019 in webkit
- Timestamp:
- Mar 26, 2015 11:39:22 AM (9 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r182011 r182019 1 2015-03-26 Antti Koivisto <antti@apple.com> 2 3 Rename Storage::Entry to Storage::Record 4 https://bugs.webkit.org/show_bug.cgi?id=143101 5 6 Reviewed by Chris Dumez. 7 8 Lets have just one type called Entry in the cache code. 9 10 * NetworkProcess/cache/NetworkCache.cpp: 11 (WebKit::NetworkCache::Cache::retrieve): 12 (WebKit::NetworkCache::Cache::store): 13 (WebKit::NetworkCache::Cache::update): 14 (WebKit::NetworkCache::Cache::traverse): 15 (WebKit::NetworkCache::Cache::dumpContentsToFile): 16 * NetworkProcess/cache/NetworkCacheEntry.cpp: 17 (WebKit::NetworkCache::Entry::Entry): 18 (WebKit::NetworkCache::Entry::encodeAsStorageRecord): 19 (WebKit::NetworkCache::Entry::decodeStorageRecord): 20 (WebKit::NetworkCache::Entry::initializeBufferFromStorageRecord): 21 (WebKit::NetworkCache::Entry::buffer): 22 (WebKit::NetworkCache::Entry::shareableResourceHandle): 23 (WebKit::NetworkCache::Entry::encode): Deleted. 24 (WebKit::NetworkCache::Entry::decode): Deleted. 25 (WebKit::NetworkCache::Entry::initializeBufferFromStorageEntry): Deleted. 26 * NetworkProcess/cache/NetworkCacheEntry.h: 27 (WebKit::NetworkCache::Entry::sourceStorageRecord): 28 (WebKit::NetworkCache::Entry::sourceStorageEntry): Deleted. 29 * NetworkProcess/cache/NetworkCacheStorage.cpp: 30 (WebKit::NetworkCache::RecordMetaData::RecordMetaData): 31 (WebKit::NetworkCache::decodeRecordMetaData): 32 (WebKit::NetworkCache::decodeRecordHeader): 33 (WebKit::NetworkCache::decodeRecord): 34 (WebKit::NetworkCache::encodeRecordMetaData): 35 (WebKit::NetworkCache::encodeRecordHeader): 36 (WebKit::NetworkCache::Storage::dispatchReadOperation): 37 (WebKit::NetworkCache::retrieveFromMemory): 38 (WebKit::NetworkCache::Storage::store): 39 (WebKit::NetworkCache::Storage::update): 40 (WebKit::NetworkCache::Storage::traverse): 41 (WebKit::NetworkCache::Storage::dispatchPendingWriteOperations): 42 (WebKit::NetworkCache::Storage::dispatchFullWriteOperation): 43 (WebKit::NetworkCache::Storage::dispatchHeaderWriteOperation): 44 (WebKit::NetworkCache::EntryMetaData::EntryMetaData): Deleted. 45 (WebKit::NetworkCache::decodeEntryMetaData): Deleted. 46 (WebKit::NetworkCache::decodeEntryHeader): Deleted. 47 (WebKit::NetworkCache::decodeEntry): Deleted. 48 (WebKit::NetworkCache::encodeEntryMetaData): Deleted. 49 (WebKit::NetworkCache::encodeEntryHeader): Deleted. 50 * NetworkProcess/cache/NetworkCacheStorage.h: 51 1 52 2015-03-26 Chris Dumez <cdumez@apple.com> 2 53 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp
r182010 r182019 227 227 unsigned priority = originalRequest.priority(); 228 228 229 m_storage->retrieve(storageKey, priority, [this, originalRequest, completionHandler, startTime, storageKey, webPageID](std::unique_ptr<Storage:: Entry> storageEntry) {230 if (! storageEntry) {229 m_storage->retrieve(storageKey, priority, [this, originalRequest, completionHandler, startTime, storageKey, webPageID](std::unique_ptr<Storage::Record> record) { 230 if (!record) { 231 231 LOG(NetworkCache, "(NetworkProcess) not found in storage"); 232 232 … … 238 238 } 239 239 240 ASSERT( storageEntry->key == storageKey);241 242 auto cacheEntry = Entry::decode(*storageEntry);243 244 auto useDecision = cacheEntry ? canUse(*cacheEntry, originalRequest) : UseDecision::NoDueToDecodeFailure;240 ASSERT(record->key == storageKey); 241 242 auto entry = Entry::decodeStorageRecord(*record); 243 244 auto useDecision = entry ? canUse(*entry, originalRequest) : UseDecision::NoDueToDecodeFailure; 245 245 switch (useDecision) { 246 246 case UseDecision::Use: 247 247 break; 248 248 case UseDecision::Validate: 249 cacheEntry->setNeedsValidation();249 entry->setNeedsValidation(); 250 250 break; 251 251 default: 252 cacheEntry = nullptr;252 entry = nullptr; 253 253 }; 254 254 255 255 #if !LOG_DISABLED 256 256 auto elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - startTime).count(); 257 #endif258 257 LOG(NetworkCache, "(NetworkProcess) retrieve complete useDecision=%d priority=%u time=%lldms", useDecision, originalRequest.priority(), elapsedMS); 259 completionHandler(WTF::move(cacheEntry)); 258 #endif 259 completionHandler(WTF::move(entry)); 260 260 261 261 if (m_statistics) … … 316 316 Entry cacheEntry(makeCacheKey(originalRequest), response, WTF::move(responseData), collectVaryingRequestHeaders(originalRequest, response)); 317 317 318 auto storageEntry = cacheEntry.encode();319 320 m_storage->store( storageEntry, [completionHandler](bool success, const Data& bodyData) {318 auto record = cacheEntry.encodeAsStorageRecord(); 319 320 m_storage->store(record, [completionHandler](bool success, const Data& bodyData) { 321 321 MappedBody mappedBody; 322 322 #if ENABLE(SHAREABLE_RESOURCE) … … 342 342 Entry updateEntry(existingEntry.key(), response, existingEntry.buffer(), collectVaryingRequestHeaders(originalRequest, response)); 343 343 344 auto update StorageEntry = updateEntry.encode();345 346 m_storage->update(update StorageEntry, existingEntry.sourceStorageEntry(), [](bool success, const Data&) {344 auto updateRecord = updateEntry.encodeAsStorageRecord(); 345 346 m_storage->update(updateRecord, existingEntry.sourceStorageRecord(), [](bool success, const Data&) { 347 347 LOG(NetworkCache, "(NetworkProcess) updated, success=%d", success); 348 348 }); … … 360 360 ASSERT(isEnabled()); 361 361 362 m_storage->traverse([traverseHandler](const Storage:: Entry* storageEntry) {363 if (! storageEntry) {362 m_storage->traverse([traverseHandler](const Storage::Record* record) { 363 if (!record) { 364 364 traverseHandler(nullptr); 365 365 return; 366 366 } 367 367 368 auto cacheEntry = Entry::decode(*storageEntry);369 if (! cacheEntry)368 auto entry = Entry::decodeStorageRecord(*record); 369 if (!entry) 370 370 return; 371 371 372 traverseHandler( cacheEntry.get());372 traverseHandler(entry.get()); 373 373 }); 374 374 } … … 387 387 return; 388 388 WebCore::writeToFile(dumpFileHandle, "[\n", 2); 389 m_storage->traverse([dumpFileHandle](const Storage:: Entry* entry) {390 if (! entry) {389 m_storage->traverse([dumpFileHandle](const Storage::Record* record) { 390 if (!record) { 391 391 WebCore::writeToFile(dumpFileHandle, "{}\n]\n", 5); 392 392 auto handle = dumpFileHandle; … … 394 394 return; 395 395 } 396 auto cacheEntry = Entry::decode(*entry);397 if (! cacheEntry)396 auto entry = Entry::decodeStorageRecord(*record); 397 if (!entry) 398 398 return; 399 399 StringBuilder json; 400 cacheEntry->asJSON(json);400 entry->asJSON(json); 401 401 json.append(",\n"); 402 402 auto writeData = json.toString().utf8(); -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEntry.cpp
r181970 r182019 50 50 } 51 51 52 Entry::Entry(const Storage:: Entry& storageEntry)52 Entry::Entry(const Storage::Record& storageEntry) 53 53 : m_key(storageEntry.key) 54 54 , m_timeStamp(storageEntry.timeStamp) 55 , m_sourceStorage Entry(storageEntry)55 , m_sourceStorageRecord(storageEntry) 56 56 { 57 57 } 58 58 59 Storage:: Entry Entry::encode() const59 Storage::Record Entry::encodeAsStorageRecord() const 60 60 { 61 61 Encoder encoder; … … 77 77 } 78 78 79 std::unique_ptr<Entry> Entry::decode (const Storage::Entry& storageEntry)79 std::unique_ptr<Entry> Entry::decodeStorageRecord(const Storage::Record& storageEntry) 80 80 { 81 81 std::unique_ptr<Entry> entry(new Entry(storageEntry)); … … 103 103 } 104 104 105 void Entry::initializeBufferFromStorage Entry() const105 void Entry::initializeBufferFromStorageRecord() const 106 106 { 107 auto* data = m_sourceStorage Entry.body.data();108 size_t size = m_sourceStorage Entry.body.size();107 auto* data = m_sourceStorageRecord.body.data(); 108 size_t size = m_sourceStorageRecord.body.size(); 109 109 #if ENABLE(SHAREABLE_RESOURCE) 110 RefPtr<SharedMemory> sharedMemory = m_sourceStorage Entry.body.isMap() ? SharedMemory::createFromVMBuffer(const_cast<uint8_t*>(data), size) : nullptr;111 RefPtr<ShareableResource> shareableResource = sharedMemory ? ShareableResource::create(sharedMemory.release(), 0, m_sourceStorage Entry.body.size()) : nullptr;110 RefPtr<SharedMemory> sharedMemory = m_sourceStorageRecord.body.isMap() ? SharedMemory::createFromVMBuffer(const_cast<uint8_t*>(data), size) : nullptr; 111 RefPtr<ShareableResource> shareableResource = sharedMemory ? ShareableResource::create(sharedMemory.release(), 0, m_sourceStorageRecord.body.size()) : nullptr; 112 112 113 113 if (shareableResource && shareableResource->createHandle(m_shareableResourceHandle)) … … 121 121 { 122 122 if (!m_buffer) 123 initializeBufferFromStorage Entry();123 initializeBufferFromStorageRecord(); 124 124 125 125 return m_buffer.get(); … … 129 129 { 130 130 if (!m_buffer) 131 initializeBufferFromStorage Entry();131 initializeBufferFromStorageRecord(); 132 132 133 133 return m_shareableResourceHandle; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEntry.h
r181970 r182019 48 48 Entry(const Key&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&, const Vector<std::pair<String, String>>& varyingRequestHeaders); 49 49 50 Storage:: Entry encode() const;51 static std::unique_ptr<Entry> decode (const Storage::Entry&);50 Storage::Record encodeAsStorageRecord() const; 51 static std::unique_ptr<Entry> decodeStorageRecord(const Storage::Record&); 52 52 53 53 const Key& key() const { return m_key; } … … 64 64 void setNeedsValidation(); 65 65 66 const Storage:: Entry& sourceStorageEntry() const { return m_sourceStorageEntry; }66 const Storage::Record& sourceStorageRecord() const { return m_sourceStorageRecord; } 67 67 68 68 void asJSON(StringBuilder&) const; 69 69 70 70 private: 71 Entry(const Storage:: Entry&);72 void initializeBufferFromStorage Entry() const;71 Entry(const Storage::Record&); 72 void initializeBufferFromStorageRecord() const; 73 73 74 74 Key m_key; … … 82 82 #endif 83 83 84 Storage:: Entry m_sourceStorageEntry{ };84 Storage::Record m_sourceStorageRecord { }; 85 85 }; 86 86 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp
r181895 r182019 132 132 } 133 133 134 struct EntryMetaData {135 EntryMetaData() { }136 explicit EntryMetaData(const Key& key)134 struct RecordMetaData { 135 RecordMetaData() { } 136 explicit RecordMetaData(const Key& key) 137 137 : cacheStorageVersion(Storage::version) 138 138 , key(key) … … 150 150 }; 151 151 152 static bool decode EntryMetaData(EntryMetaData& metaData, const Data& fileData)152 static bool decodeRecordMetaData(RecordMetaData& metaData, const Data& fileData) 153 153 { 154 154 bool success = false; … … 179 179 } 180 180 181 static bool decode EntryHeader(const Data& fileData, EntryMetaData& metaData, Data& data)182 { 183 if (!decode EntryMetaData(metaData, fileData)) {181 static bool decodeRecordHeader(const Data& fileData, RecordMetaData& metaData, Data& data) 182 { 183 if (!decodeRecordMetaData(metaData, fileData)) { 184 184 LOG(NetworkCacheStorage, "(NetworkProcess) meta data decode failure"); 185 185 return false; … … 204 204 } 205 205 206 static std::unique_ptr<Storage:: Entry> decodeEntry(const Data& fileData, int fd, const Key& key)207 { 208 EntryMetaData metaData;206 static std::unique_ptr<Storage::Record> decodeRecord(const Data& fileData, int fd, const Key& key) 207 { 208 RecordMetaData metaData; 209 209 Data headerData; 210 if (!decode EntryHeader(fileData, metaData, headerData))210 if (!decodeRecordHeader(fileData, metaData, headerData)) 211 211 return nullptr; 212 212 … … 231 231 } 232 232 233 return std::make_unique<Storage:: Entry>(Storage::Entry{233 return std::make_unique<Storage::Record>(Storage::Record { 234 234 metaData.key, 235 235 metaData.timeStamp, … … 239 239 } 240 240 241 static Data encode EntryMetaData(const EntryMetaData& entry)241 static Data encodeRecordMetaData(const RecordMetaData& metaData) 242 242 { 243 243 Encoder encoder; 244 244 245 encoder << entry.cacheStorageVersion;246 encoder << entry.key;247 encoder << entry.timeStamp;248 encoder << entry.headerChecksum;249 encoder << entry.headerSize;250 encoder << entry.bodyChecksum;251 encoder << entry.bodySize;245 encoder << metaData.cacheStorageVersion; 246 encoder << metaData.key; 247 encoder << metaData.timeStamp; 248 encoder << metaData.headerChecksum; 249 encoder << metaData.headerSize; 250 encoder << metaData.bodyChecksum; 251 encoder << metaData.bodySize; 252 252 253 253 encoder.encodeChecksum(); … … 256 256 } 257 257 258 static Data encode EntryHeader(const Storage::Entry& entry)259 { 260 EntryMetaData metaData(entry.key);261 metaData.timeStamp = entry.timeStamp;262 metaData.headerChecksum = hashData( entry.header);263 metaData.headerSize = entry.header.size();264 metaData.bodyChecksum = hashData( entry.body);265 metaData.bodySize = entry.body.size();266 267 auto encodedMetaData = encode EntryMetaData(metaData);268 auto headerData = concatenate(encodedMetaData, entry.header);269 if (! entry.body.size())258 static Data encodeRecordHeader(const Storage::Record& record) 259 { 260 RecordMetaData metaData(record.key); 261 metaData.timeStamp = record.timeStamp; 262 metaData.headerChecksum = hashData(record.header); 263 metaData.headerSize = record.header.size(); 264 metaData.bodyChecksum = hashData(record.body); 265 metaData.bodySize = record.body.size(); 266 267 auto encodedMetaData = encodeRecordMetaData(metaData); 268 auto headerData = concatenate(encodedMetaData, record.header); 269 if (!record.body.size()) 270 270 return { headerData }; 271 271 … … 314 314 read.completionHandler(nullptr); 315 315 } else { 316 auto entry = decodeEntry(fileData, channel->fileDescriptor(), read.key);317 bool success = read.completionHandler(WTF::move( entry));316 auto record = decodeRecord(fileData, channel->fileDescriptor(), read.key); 317 bool success = read.completionHandler(WTF::move(record)); 318 318 if (success) 319 319 updateFileAccessTime(*channel); … … 355 355 { 356 356 for (auto& operation : operations) { 357 if (operation-> entry.key == key) {357 if (operation->record.key == key) { 358 358 LOG(NetworkCacheStorage, "(NetworkProcess) found write operation in progress"); 359 auto entry = operation->entry;360 RunLoop::main().dispatch([ entry, completionHandler] {361 completionHandler(std::make_unique<Storage:: Entry>(entry));359 auto record = operation->record; 360 RunLoop::main().dispatch([record, completionHandler] { 361 completionHandler(std::make_unique<Storage::Record>(record)); 362 362 }); 363 363 return true; … … 392 392 } 393 393 394 void Storage::store(const Entry& entry, StoreCompletionHandler&& completionHandler)395 { 396 ASSERT(RunLoop::isMain()); 397 ASSERT(! entry.key.isNull());394 void Storage::store(const Record& record, StoreCompletionHandler&& completionHandler) 395 { 396 ASSERT(RunLoop::isMain()); 397 ASSERT(!record.key.isNull()); 398 398 399 399 if (!m_maximumSize) { … … 402 402 } 403 403 404 m_pendingWriteOperations.append(new WriteOperation { entry, { }, WTF::move(completionHandler) });404 m_pendingWriteOperations.append(new WriteOperation { record, { }, WTF::move(completionHandler) }); 405 405 406 406 // Add key to the filter already here as we do lookups from the pending operations too. 407 m_contentsFilter.add( entry.key.shortHash());407 m_contentsFilter.add(record.key.shortHash()); 408 408 409 409 dispatchPendingWriteOperations(); 410 410 } 411 411 412 void Storage::update(const Entry& updateEntry, const Entry& existingEntry, StoreCompletionHandler&& completionHandler)413 { 414 ASSERT(RunLoop::isMain()); 415 ASSERT(!existing Entry.key.isNull());416 ASSERT(existing Entry.key == updateEntry.key);412 void Storage::update(const Record& updateRecord, const Record& existingRecord, StoreCompletionHandler&& completionHandler) 413 { 414 ASSERT(RunLoop::isMain()); 415 ASSERT(!existingRecord.key.isNull()); 416 ASSERT(existingRecord.key == updateRecord.key); 417 417 418 418 if (!m_maximumSize) { … … 421 421 } 422 422 423 m_pendingWriteOperations.append(new WriteOperation { update Entry, existingEntry, WTF::move(completionHandler) });423 m_pendingWriteOperations.append(new WriteOperation { updateRecord, existingRecord, WTF::move(completionHandler) }); 424 424 425 425 dispatchPendingWriteOperations(); 426 426 } 427 427 428 void Storage::traverse(std::function<void (const Entry*)>&& traverseHandler)428 void Storage::traverse(std::function<void (const Record*)>&& traverseHandler) 429 429 { 430 430 StringCapture cachePathCapture(m_directoryPath); … … 437 437 // FIXME: Traversal is slower than it should be due to lack of parallelism. 438 438 channel->readSync(0, headerReadSize, [this, &traverseHandler](Data& fileData, int) { 439 EntryMetaData metaData;439 RecordMetaData metaData; 440 440 Data headerData; 441 if (decode EntryHeader(fileData, metaData, headerData)) {442 Entry entry{ metaData.key, metaData.timeStamp, headerData, { } };443 traverseHandler(& entry);441 if (decodeRecordHeader(fileData, metaData, headerData)) { 442 Record record { metaData.key, metaData.timeStamp, headerData, { } }; 443 traverseHandler(&record); 444 444 } 445 445 }); … … 466 466 m_activeWriteOperations.add(WTF::move(writeOperation)); 467 467 468 if (write.existing Entry && cacheMayContain(write.entry.key.shortHash())) {468 if (write.existingRecord && cacheMayContain(write.record.key.shortHash())) { 469 469 dispatchHeaderWriteOperation(write); 470 470 continue; … … 479 479 ASSERT(m_activeWriteOperations.contains(&write)); 480 480 481 if (!m_contentsFilter.mayContain(write. entry.key.shortHash()))482 m_contentsFilter.add(write. entry.key.shortHash());481 if (!m_contentsFilter.mayContain(write.record.key.shortHash())) 482 m_contentsFilter.add(write.record.key.shortHash()); 483 483 484 484 StringCapture cachePathCapture(m_directoryPath); 485 485 backgroundIOQueue().dispatch([this, &write, cachePathCapture] { 486 auto encodedHeader = encode EntryHeader(write.entry);487 auto headerAndBodyData = concatenate(encodedHeader, write. entry.body);488 489 auto channel = openFileForKey(write. entry.key, IOChannel::Type::Create, cachePathCapture.string());486 auto encodedHeader = encodeRecordHeader(write.record); 487 auto headerAndBodyData = concatenate(encodedHeader, write.record.body); 488 489 auto channel = openFileForKey(write.record.key, IOChannel::Type::Create, cachePathCapture.string()); 490 490 int fd = channel->fileDescriptor(); 491 491 size_t bodyOffset = encodedHeader.size(); … … 494 494 LOG(NetworkCacheStorage, "(NetworkProcess) write complete error=%d", error); 495 495 if (error) { 496 if (m_contentsFilter.mayContain(write. entry.key.shortHash()))497 m_contentsFilter.remove(write. entry.key.shortHash());496 if (m_contentsFilter.mayContain(write.record.key.shortHash())) 497 m_contentsFilter.remove(write.record.key.shortHash()); 498 498 } 499 size_t bodySize = write. entry.body.size();499 size_t bodySize = write.record.body.size(); 500 500 size_t totalSize = bodyOffset + bodySize; 501 501 … … 519 519 { 520 520 ASSERT(RunLoop::isMain()); 521 ASSERT(write.existing Entry);521 ASSERT(write.existingRecord); 522 522 ASSERT(m_activeWriteOperations.contains(&write)); 523 ASSERT(cacheMayContain(write. entry.key.shortHash()));523 ASSERT(cacheMayContain(write.record.key.shortHash())); 524 524 525 525 // Try to update the header of an existing entry. 526 526 StringCapture cachePathCapture(m_directoryPath); 527 527 backgroundIOQueue().dispatch([this, &write, cachePathCapture] { 528 auto headerData = encode EntryHeader(write.entry);529 auto existingHeaderData = encode EntryHeader(write.existingEntry.value());528 auto headerData = encodeRecordHeader(write.record); 529 auto existingHeaderData = encodeRecordHeader(write.existingRecord.value()); 530 530 531 531 bool pageRoundedHeaderSizeChanged = headerData.size() != existingHeaderData.size(); … … 538 538 } 539 539 540 auto channel = openFileForKey(write. entry.key, IOChannel::Type::Write, cachePathCapture.string());540 auto channel = openFileForKey(write.record.key, IOChannel::Type::Write, cachePathCapture.string()); 541 541 channel->write(0, headerData, [this, &write](int error) { 542 542 LOG(NetworkCacheStorage, "(NetworkProcess) update complete error=%d", error); 543 543 544 544 if (error) 545 remove(write. entry.key);545 remove(write.record.key); 546 546 547 547 write.completionHandler(!error, { }); -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h
r181816 r182019 48 48 static std::unique_ptr<Storage> open(const String& cachePath); 49 49 50 struct Entry{50 struct Record { 51 51 Key key; 52 52 std::chrono::milliseconds timeStamp; … … 55 55 }; 56 56 // This may call completion handler synchronously on failure. 57 typedef std::function<bool (std::unique_ptr< Entry>)> RetrieveCompletionHandler;57 typedef std::function<bool (std::unique_ptr<Record>)> RetrieveCompletionHandler; 58 58 void retrieve(const Key&, unsigned priority, RetrieveCompletionHandler&&); 59 59 60 60 typedef std::function<void (bool success, const Data& mappedBody)> StoreCompletionHandler; 61 void store(const Entry&, StoreCompletionHandler&&);62 void update(const Entry& updateEntry, const Entry& existingEntry, StoreCompletionHandler&&);61 void store(const Record&, StoreCompletionHandler&&); 62 void update(const Record& updateRecord, const Record& existingRecord, StoreCompletionHandler&&); 63 63 64 64 void remove(const Key&); 65 65 66 66 // Null entry signals end. 67 void traverse(std::function<void (const Entry*)>&&);67 void traverse(std::function<void (const Record*)>&&); 68 68 69 69 void setMaximumSize(size_t); … … 90 90 91 91 struct WriteOperation { 92 Entry entry;93 Optional< Entry> existingEntry;92 Record record; 93 Optional<Record> existingRecord; 94 94 StoreCompletionHandler completionHandler; 95 95 };
Note: See TracChangeset
for help on using the changeset viewer.