Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "base/metrics/persistent_histogram_allocator.h" | 5 #include "base/metrics/persistent_histogram_allocator.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 776 Set(WrapUnique( | 776 Set(WrapUnique( |
| 777 new GlobalHistogramAllocator(MakeUnique<FilePersistentMemoryAllocator>( | 777 new GlobalHistogramAllocator(MakeUnique<FilePersistentMemoryAllocator>( |
| 778 std::move(mmfile), size, id, name, false)))); | 778 std::move(mmfile), size, id, name, false)))); |
| 779 Get()->SetPersistentLocation(file_path); | 779 Get()->SetPersistentLocation(file_path); |
| 780 return true; | 780 return true; |
| 781 } | 781 } |
| 782 | 782 |
| 783 // static | 783 // static |
| 784 bool GlobalHistogramAllocator::CreateWithActiveFile(const FilePath& base_path, | 784 bool GlobalHistogramAllocator::CreateWithActiveFile(const FilePath& base_path, |
| 785 const FilePath& active_path, | 785 const FilePath& active_path, |
| 786 const FilePath& spare_path, | |
| 786 size_t size, | 787 size_t size, |
| 787 uint64_t id, | 788 uint64_t id, |
| 788 StringPiece name) { | 789 StringPiece name) { |
| 790 // Old "active" becomes "base". | |
| 789 if (!base::ReplaceFile(active_path, base_path, nullptr)) | 791 if (!base::ReplaceFile(active_path, base_path, nullptr)) |
| 790 base::DeleteFile(base_path, /*recursive=*/false); | 792 base::DeleteFile(base_path, /*recursive=*/false); |
| 793 DCHECK(!base::PathExists(active_path)); | |
| 794 | |
| 795 // Move any "spare" into "active". Okay to continue if file doesn't exist. | |
| 796 if (!spare_path.empty()) { | |
| 797 base::ReplaceFile(spare_path, active_path, nullptr); | |
| 798 DCHECK(!base::PathExists(spare_path)); | |
| 799 } | |
| 791 | 800 |
| 792 return base::GlobalHistogramAllocator::CreateWithFile(active_path, size, id, | 801 return base::GlobalHistogramAllocator::CreateWithFile(active_path, size, id, |
| 793 name); | 802 name); |
| 794 } | 803 } |
| 795 | 804 |
| 796 // static | 805 // static |
| 797 bool GlobalHistogramAllocator::CreateWithActiveFileInDir(const FilePath& dir, | 806 bool GlobalHistogramAllocator::CreateWithActiveFileInDir(const FilePath& dir, |
| 798 size_t size, | 807 size_t size, |
| 799 uint64_t id, | 808 uint64_t id, |
| 800 StringPiece name) { | 809 StringPiece name) { |
| 801 FilePath base_path, active_path; | 810 FilePath base_path, active_path, spare_path; |
| 802 ConstructFilePaths(dir, name, &base_path, &active_path); | 811 ConstructFilePaths(dir, name, &base_path, &active_path, &spare_path); |
| 803 return CreateWithActiveFile(base_path, active_path, size, id, name); | 812 return CreateWithActiveFile(base_path, active_path, spare_path, size, id, |
| 813 name); | |
| 804 } | 814 } |
| 805 | 815 |
| 806 // static | 816 // static |
| 807 void GlobalHistogramAllocator::ConstructFilePaths(const FilePath& dir, | 817 void GlobalHistogramAllocator::ConstructFilePaths(const FilePath& dir, |
| 808 StringPiece name, | 818 StringPiece name, |
| 809 FilePath* out_base_path, | 819 FilePath* out_base_path, |
| 810 FilePath* out_active_path) { | 820 FilePath* out_active_path, |
| 821 FilePath* out_spare_path) { | |
| 811 if (out_base_path) { | 822 if (out_base_path) { |
| 812 *out_base_path = dir.AppendASCII(name).AddExtension( | 823 *out_base_path = dir.AppendASCII(name).AddExtension( |
| 813 PersistentMemoryAllocator::kFileExtension); | 824 PersistentMemoryAllocator::kFileExtension); |
| 814 } | 825 } |
| 815 if (out_active_path) { | 826 if (out_active_path) { |
| 816 *out_active_path = | 827 *out_active_path = |
| 817 dir.AppendASCII(name.as_string() + std::string("-active")) | 828 dir.AppendASCII(name.as_string() + std::string("-active")) |
| 818 .AddExtension(PersistentMemoryAllocator::kFileExtension); | 829 .AddExtension(PersistentMemoryAllocator::kFileExtension); |
| 819 } | 830 } |
| 831 if (out_spare_path) { | |
| 832 *out_spare_path = | |
| 833 dir.AppendASCII(name.as_string() + std::string("-spare")) | |
| 834 .AddExtension(PersistentMemoryAllocator::kFileExtension); | |
| 835 } | |
| 836 } | |
| 837 | |
| 838 // static | |
| 839 bool GlobalHistogramAllocator::CreateSpareFile(const FilePath& spare_path, | |
| 840 size_t size) { | |
| 841 FilePath temp_spare_path = spare_path.AddExtension(FILE_PATH_LITERAL(".tmp")); | |
| 842 bool success = true; | |
| 843 { | |
| 844 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.
| |
| 845 File::FLAG_READ | File::FLAG_WRITE); | |
| 846 if (!spare_file.IsValid()) | |
| 847 return false; | |
| 848 | |
| 849 MemoryMappedFile mmfile; | |
| 850 mmfile.Initialize(std::move(spare_file), {0, static_cast<int64_t>(size)}, | |
| 851 MemoryMappedFile::READ_WRITE_EXTEND); | |
| 852 success = mmfile.IsValid(); | |
| 853 } | |
| 854 | |
| 855 if (success) | |
| 856 success = ReplaceFile(temp_spare_path, spare_path, nullptr); | |
| 857 | |
| 858 if (!success) | |
| 859 DeleteFile(temp_spare_path, /*recursive=*/false); | |
| 860 | |
| 861 return success; | |
| 862 } | |
| 863 | |
| 864 // static | |
| 865 bool GlobalHistogramAllocator::CreateSpareFileInDir(const FilePath& dir, | |
| 866 size_t size, | |
| 867 StringPiece name) { | |
| 868 FilePath spare_path; | |
| 869 ConstructFilePaths(dir, name, nullptr, nullptr, &spare_path); | |
| 870 return CreateSpareFile(spare_path, size); | |
| 820 } | 871 } |
| 821 #endif // !defined(OS_NACL) | 872 #endif // !defined(OS_NACL) |
| 822 | 873 |
| 823 // static | 874 // static |
| 824 void GlobalHistogramAllocator::CreateWithSharedMemoryHandle( | 875 void GlobalHistogramAllocator::CreateWithSharedMemoryHandle( |
| 825 const SharedMemoryHandle& handle, | 876 const SharedMemoryHandle& handle, |
| 826 size_t size) { | 877 size_t size) { |
| 827 std::unique_ptr<SharedMemory> shm( | 878 std::unique_ptr<SharedMemory> shm( |
| 828 new SharedMemory(handle, /*readonly=*/false)); | 879 new SharedMemory(handle, /*readonly=*/false)); |
| 829 if (!shm->Map(size) || | 880 if (!shm->Map(size) || |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 964 while (true) { | 1015 while (true) { |
| 965 std::unique_ptr<HistogramBase> histogram = | 1016 std::unique_ptr<HistogramBase> histogram = |
| 966 import_iterator_.GetNextWithIgnore(record_to_ignore); | 1017 import_iterator_.GetNextWithIgnore(record_to_ignore); |
| 967 if (!histogram) | 1018 if (!histogram) |
| 968 break; | 1019 break; |
| 969 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram.release()); | 1020 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram.release()); |
| 970 } | 1021 } |
| 971 } | 1022 } |
| 972 | 1023 |
| 973 } // namespace base | 1024 } // namespace base |
| OLD | NEW |