OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/disk_cache/simple/simple_index_file.h" | 5 #include "net/disk_cache/simple/simple_index_file.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_enumerator.h" | 10 #include "base/files/file_enumerator.h" |
| 11 #include "base/files/memory_mapped_file.h" |
11 #include "base/hash.h" | 12 #include "base/hash.h" |
12 #include "base/logging.h" | 13 #include "base/logging.h" |
13 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
14 #include "base/pickle.h" | 15 #include "base/pickle.h" |
15 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
16 #include "base/task_runner_util.h" | 17 #include "base/task_runner_util.h" |
17 #include "base/threading/thread_restrictions.h" | 18 #include "base/threading/thread_restrictions.h" |
18 #include "net/disk_cache/simple/simple_entry_format.h" | 19 #include "net/disk_cache/simple/simple_entry_format.h" |
19 #include "net/disk_cache/simple/simple_index.h" | 20 #include "net/disk_cache/simple/simple_index.h" |
20 #include "net/disk_cache/simple/simple_synchronous_entry.h" | 21 #include "net/disk_cache/simple/simple_synchronous_entry.h" |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 | 248 |
248 UMA_HISTOGRAM_ENUMERATION("SimpleCache.IndexInitializeMethod", | 249 UMA_HISTOGRAM_ENUMERATION("SimpleCache.IndexInitializeMethod", |
249 initialize_method, INITIALIZE_METHOD_MAX); | 250 initialize_method, INITIALIZE_METHOD_MAX); |
250 } | 251 } |
251 | 252 |
252 // static | 253 // static |
253 void SimpleIndexFile::SyncLoadFromDisk(const base::FilePath& index_filename, | 254 void SimpleIndexFile::SyncLoadFromDisk(const base::FilePath& index_filename, |
254 SimpleIndexLoadResult* out_result) { | 255 SimpleIndexLoadResult* out_result) { |
255 out_result->Reset(); | 256 out_result->Reset(); |
256 | 257 |
257 std::string contents; | 258 base::MemoryMappedFile index_file_map; |
258 if (!file_util::ReadFileToString(index_filename, &contents)) { | 259 if (!index_file_map.Initialize(index_filename)) { |
259 LOG(WARNING) << "Could not read Simple Index file."; | 260 LOG(WARNING) << "Could not map Simple Index file."; |
260 base::DeleteFile(index_filename, false); | 261 base::DeleteFile(index_filename, false); |
261 return; | 262 return; |
262 } | 263 } |
263 | 264 |
264 SimpleIndexFile::Deserialize(contents.data(), contents.size(), out_result); | 265 SimpleIndexFile::Deserialize( |
| 266 reinterpret_cast<const char*>(index_file_map.data()), |
| 267 index_file_map.length(), out_result); |
265 | 268 |
266 if (!out_result->did_load) | 269 if (!out_result->did_load) |
267 base::DeleteFile(index_filename, false); | 270 base::DeleteFile(index_filename, false); |
268 } | 271 } |
269 | 272 |
270 // static | 273 // static |
271 scoped_ptr<Pickle> SimpleIndexFile::Serialize( | 274 scoped_ptr<Pickle> SimpleIndexFile::Serialize( |
272 const SimpleIndexFile::IndexMetadata& index_metadata, | 275 const SimpleIndexFile::IndexMetadata& index_metadata, |
273 const SimpleIndex::EntrySet& entries) { | 276 const SimpleIndex::EntrySet& entries) { |
274 scoped_ptr<Pickle> pickle(new Pickle(sizeof(SimpleIndexFile::PickleHeader))); | 277 scoped_ptr<Pickle> pickle(new Pickle(sizeof(SimpleIndexFile::PickleHeader))); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 if (!index_metadata.Deserialize(&pickle_it)) { | 318 if (!index_metadata.Deserialize(&pickle_it)) { |
316 LOG(ERROR) << "Invalid index_metadata on Simple Cache Index."; | 319 LOG(ERROR) << "Invalid index_metadata on Simple Cache Index."; |
317 return; | 320 return; |
318 } | 321 } |
319 | 322 |
320 if (!index_metadata.CheckIndexMetadata()) { | 323 if (!index_metadata.CheckIndexMetadata()) { |
321 LOG(ERROR) << "Invalid index_metadata on Simple Cache Index."; | 324 LOG(ERROR) << "Invalid index_metadata on Simple Cache Index."; |
322 return; | 325 return; |
323 } | 326 } |
324 | 327 |
| 328 #if !defined(OS_WIN) |
| 329 // TODO(gavinp): Consider using std::unordered_map. |
| 330 entries->resize(index_metadata.GetNumberOfEntries() + kExtraSizeForMerge); |
| 331 #endif |
325 while (entries->size() < index_metadata.GetNumberOfEntries()) { | 332 while (entries->size() < index_metadata.GetNumberOfEntries()) { |
326 uint64 hash_key; | 333 uint64 hash_key; |
327 EntryMetadata entry_metadata; | 334 EntryMetadata entry_metadata; |
328 if (!pickle_it.ReadUInt64(&hash_key) || | 335 if (!pickle_it.ReadUInt64(&hash_key) || |
329 !entry_metadata.Deserialize(&pickle_it)) { | 336 !entry_metadata.Deserialize(&pickle_it)) { |
330 LOG(WARNING) << "Invalid EntryMetadata in Simple Index file."; | 337 LOG(WARNING) << "Invalid EntryMetadata in Simple Index file."; |
331 entries->clear(); | 338 entries->clear(); |
332 return; | 339 return; |
333 } | 340 } |
334 SimpleIndex::InsertInEntrySet(hash_key, entry_metadata, entries); | 341 SimpleIndex::InsertInEntrySet(hash_key, entry_metadata, entries); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 // static | 414 // static |
408 bool SimpleIndexFile::IsIndexFileStale(base::Time cache_last_modified, | 415 bool SimpleIndexFile::IsIndexFileStale(base::Time cache_last_modified, |
409 const base::FilePath& index_file_path) { | 416 const base::FilePath& index_file_path) { |
410 base::Time index_mtime; | 417 base::Time index_mtime; |
411 if (!simple_util::GetMTime(index_file_path, &index_mtime)) | 418 if (!simple_util::GetMTime(index_file_path, &index_mtime)) |
412 return true; | 419 return true; |
413 return index_mtime < cache_last_modified; | 420 return index_mtime < cache_last_modified; |
414 } | 421 } |
415 | 422 |
416 } // namespace disk_cache | 423 } // namespace disk_cache |
OLD | NEW |