Chromium Code Reviews| Index: base/metrics/persistent_histogram_allocator.cc |
| diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc |
| index e23c6353c7423829251a9c0fc8d7988dc0d9b887..13b51b1dba641af0a59078aa763bbe5546aba198 100644 |
| --- a/base/metrics/persistent_histogram_allocator.cc |
| +++ b/base/metrics/persistent_histogram_allocator.cc |
| @@ -783,11 +783,20 @@ bool GlobalHistogramAllocator::CreateWithFile( |
| // static |
| bool GlobalHistogramAllocator::CreateWithActiveFile(const FilePath& base_path, |
| const FilePath& active_path, |
| + const FilePath& spare_path, |
| size_t size, |
| uint64_t id, |
| StringPiece name) { |
| + // Old "active" becomes "base". |
| if (!base::ReplaceFile(active_path, base_path, nullptr)) |
| base::DeleteFile(base_path, /*recursive=*/false); |
| + DCHECK(!base::PathExists(active_path)); |
| + |
| + // Move any "spare" into "active". Okay to continue if file doesn't exist. |
| + if (!spare_path.empty()) { |
| + base::ReplaceFile(spare_path, active_path, nullptr); |
| + DCHECK(!base::PathExists(spare_path)); |
| + } |
| return base::GlobalHistogramAllocator::CreateWithFile(active_path, size, id, |
| name); |
| @@ -798,16 +807,18 @@ bool GlobalHistogramAllocator::CreateWithActiveFileInDir(const FilePath& dir, |
| size_t size, |
| uint64_t id, |
| StringPiece name) { |
| - FilePath base_path, active_path; |
| - ConstructFilePaths(dir, name, &base_path, &active_path); |
| - return CreateWithActiveFile(base_path, active_path, size, id, name); |
| + FilePath base_path, active_path, spare_path; |
| + ConstructFilePaths(dir, name, &base_path, &active_path, &spare_path); |
| + return CreateWithActiveFile(base_path, active_path, spare_path, size, id, |
| + name); |
| } |
| // static |
| void GlobalHistogramAllocator::ConstructFilePaths(const FilePath& dir, |
| StringPiece name, |
| FilePath* out_base_path, |
| - FilePath* out_active_path) { |
| + FilePath* out_active_path, |
| + FilePath* out_spare_path) { |
| if (out_base_path) { |
| *out_base_path = dir.AppendASCII(name).AddExtension( |
| PersistentMemoryAllocator::kFileExtension); |
| @@ -817,6 +828,46 @@ void GlobalHistogramAllocator::ConstructFilePaths(const FilePath& dir, |
| dir.AppendASCII(name.as_string() + std::string("-active")) |
| .AddExtension(PersistentMemoryAllocator::kFileExtension); |
| } |
| + if (out_spare_path) { |
| + *out_spare_path = |
| + dir.AppendASCII(name.as_string() + std::string("-spare")) |
| + .AddExtension(PersistentMemoryAllocator::kFileExtension); |
| + } |
| +} |
| + |
| +// static |
| +bool GlobalHistogramAllocator::CreateSpareFile(const FilePath& spare_path, |
| + size_t size) { |
| + FilePath temp_spare_path = spare_path.AddExtension(FILE_PATH_LITERAL(".tmp")); |
| + bool success = true; |
| + { |
| + File spare_file(temp_spare_path, File::FLAG_CREATE_ALWAYS | |
|
Alexei Svitkine (slow)
2017/05/23 17:27:58
Nit: I would have wrapped after the , and aligned
bcwhite
2017/05/24 17:01:49
Yes, this is git cl format.
|
| + File::FLAG_READ | File::FLAG_WRITE); |
| + if (!spare_file.IsValid()) |
| + return false; |
| + |
| + MemoryMappedFile mmfile; |
| + mmfile.Initialize(std::move(spare_file), {0, static_cast<int64_t>(size)}, |
| + MemoryMappedFile::READ_WRITE_EXTEND); |
| + success = mmfile.IsValid(); |
| + } |
| + |
| + if (success) |
| + success = ReplaceFile(temp_spare_path, spare_path, nullptr); |
| + |
| + if (!success) |
| + DeleteFile(temp_spare_path, /*recursive=*/false); |
| + |
| + return success; |
| +} |
| + |
| +// static |
| +bool GlobalHistogramAllocator::CreateSpareFileInDir(const FilePath& dir, |
| + size_t size, |
| + StringPiece name) { |
| + FilePath spare_path; |
| + ConstructFilePaths(dir, name, nullptr, nullptr, &spare_path); |
| + return CreateSpareFile(spare_path, size); |
| } |
| #endif // !defined(OS_NACL) |