Index: net/disk_cache/entry_impl.cc |
=================================================================== |
--- net/disk_cache/entry_impl.cc (revision 22579) |
+++ net/disk_cache/entry_impl.cc (working copy) |
@@ -84,6 +84,7 @@ |
for (int i = 0; i < kNumStreams; i++) { |
unreported_size_[i] = 0; |
} |
+ key_file_ = NULL; |
} |
// When an entry is deleted from the cache, we clean up all the data associated |
@@ -139,25 +140,29 @@ |
std::string EntryImpl::GetKey() const { |
CacheEntryBlock* entry = const_cast<CacheEntryBlock*>(&entry_); |
- if (entry->Data()->key_len > kMaxInternalKeyLength) { |
- Addr address(entry->Data()->long_key); |
- DCHECK(address.is_initialized()); |
- COMPILE_ASSERT(kNumStreams == kKeyFileIndex, invalid_key_index); |
- File* file = const_cast<EntryImpl*>(this)->GetBackingFile(address, |
- kKeyFileIndex); |
+ if (entry->Data()->key_len <= kMaxInternalKeyLength) |
+ return std::string(entry->Data()->key); |
- size_t offset = 0; |
- if (address.is_block_file()) |
- offset = address.start_block() * address.BlockSize() + kBlockHeaderSize; |
+ Addr address(entry->Data()->long_key); |
+ DCHECK(address.is_initialized()); |
+ size_t offset = 0; |
+ if (address.is_block_file()) |
+ offset = address.start_block() * address.BlockSize() + kBlockHeaderSize; |
- std::string key; |
- if (!file || !file->Read(WriteInto(&key, entry->Data()->key_len + 1), |
- entry->Data()->key_len + 1, offset)) |
- key.clear(); |
- return key; |
- } else { |
- return std::string(entry->Data()->key); |
+ if (!key_file_) { |
+ // We keep a copy of the file needed to access the key so that we can |
+ // always return this object's key, even if the backend is disabled. |
+ COMPILE_ASSERT(kNumStreams == kKeyFileIndex, invalid_key_index); |
+ key_file_ = const_cast<EntryImpl*>(this)->GetBackingFile(address, |
+ kKeyFileIndex); |
} |
+ |
+ std::string key; |
+ if (!key_file_ || |
+ !key_file_->Read(WriteInto(&key, entry->Data()->key_len + 1), |
+ entry->Data()->key_len + 1, offset)) |
+ key.clear(); |
+ return key; |
} |
Time EntryImpl::GetLastUsed() const { |
@@ -402,19 +407,19 @@ |
return false; |
entry_store->long_key = address.value(); |
- File* file = GetBackingFile(address, kKeyFileIndex); |
+ key_file_ = GetBackingFile(address, kKeyFileIndex); |
size_t offset = 0; |
if (address.is_block_file()) |
offset = address.start_block() * address.BlockSize() + kBlockHeaderSize; |
- if (!file || !file->Write(key.data(), key.size(), offset)) { |
+ if (!key_file_ || !key_file_->Write(key.data(), key.size(), offset)) { |
DeleteData(address, kKeyFileIndex); |
return false; |
} |
if (address.is_separate_file()) |
- file->SetLength(key.size() + 1); |
+ key_file_->SetLength(key.size() + 1); |
} else { |
memcpy(entry_store->key, key.data(), key.size()); |
entry_store->key[key.size()] = '\0'; |