Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #ifndef BASE_METRICS_PERSISTENT_SYSTEM_PROFILE_H_ | 5 #ifndef BASE_METRICS_PERSISTENT_SYSTEM_PROFILE_H_ |
| 6 #define BASE_METRICS_PERSISTENT_SYSTEM_PROFILE_H_ | 6 #define BASE_METRICS_PERSISTENT_SYSTEM_PROFILE_H_ |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/strings/string_piece.h" | |
| 10 #include "base/threading/thread_checker.h" | 11 #include "base/threading/thread_checker.h" |
| 11 #include "components/metrics/proto/system_profile.pb.h" | 12 #include "components/metrics/proto/system_profile.pb.h" |
| 12 | 13 |
| 13 namespace base { | 14 namespace base { |
| 14 template <typename T> | 15 template <typename T> |
| 15 struct DefaultSingletonTraits; | 16 struct DefaultSingletonTraits; |
| 16 class PersistentMemoryAllocator; | 17 class PersistentMemoryAllocator; |
| 17 } // namespace base | 18 } // namespace base |
| 18 | 19 |
| 19 namespace metrics { | 20 namespace metrics { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 31 base::PersistentMemoryAllocator* memory_allocator); | 32 base::PersistentMemoryAllocator* memory_allocator); |
| 32 | 33 |
| 33 // Stores a complete system profile. Use the version taking the serialized | 34 // Stores a complete system profile. Use the version taking the serialized |
| 34 // version if available to avoid multiple serialization actions. The | 35 // version if available to avoid multiple serialization actions. The |
| 35 // |complete| flag indicates that this profile contains all known information | 36 // |complete| flag indicates that this profile contains all known information |
| 36 // and can replace whatever exists. If the flag is false, the profile will be | 37 // and can replace whatever exists. If the flag is false, the profile will be |
| 37 // stored only if there is nothing else already present. | 38 // stored only if there is nothing else already present. |
| 38 void SetSystemProfile(const std::string& serialized_profile, bool complete); | 39 void SetSystemProfile(const std::string& serialized_profile, bool complete); |
| 39 void SetSystemProfile(const SystemProfileProto& profile, bool complete); | 40 void SetSystemProfile(const SystemProfileProto& profile, bool complete); |
| 40 | 41 |
| 42 // Records the existence of a field trial. | |
| 43 void SetFieldTrial(base::StringPiece trial, base::StringPiece group); | |
| 44 | |
| 41 // Tests if a persistent memory allocator contains an system profile. | 45 // Tests if a persistent memory allocator contains an system profile. |
| 42 static bool HasSystemProfile( | 46 static bool HasSystemProfile( |
| 43 const base::PersistentMemoryAllocator& memory_allocator); | 47 const base::PersistentMemoryAllocator& memory_allocator); |
| 44 | 48 |
| 45 // Retrieves the system profile from a persistent memory allocator. Returns | 49 // Retrieves the system profile from a persistent memory allocator. Returns |
| 46 // true if a profile was successfully retrieved. | 50 // true if a profile was successfully retrieved. |
| 47 static bool GetSystemProfile( | 51 static bool GetSystemProfile( |
| 48 const base::PersistentMemoryAllocator& memory_allocator, | 52 const base::PersistentMemoryAllocator& memory_allocator, |
| 49 SystemProfileProto* system_profile); | 53 SystemProfileProto* system_profile); |
| 50 | 54 |
| 51 private: | 55 private: |
| 52 friend class PersistentSystemProfileTest; | 56 friend class PersistentSystemProfileTest; |
| 53 | 57 |
| 54 // Defines record types that can be stored inside our local Allocators. | 58 // Defines record types that can be stored inside our local Allocators. |
| 55 enum RecordType : uint8_t { | 59 enum RecordType : uint8_t { |
| 56 kUnusedSpace = 0, // The default value for empty memory. | 60 kUnusedSpace = 0, // The default value for empty memory. |
| 57 kSystemProfileProto, | 61 kSystemProfileProto, |
| 62 kFieldTrialInfo, | |
| 58 }; | 63 }; |
| 59 | 64 |
| 60 // A class for managing record allocations inside a persistent memory segment. | 65 // A class for managing record allocations inside a persistent memory segment. |
| 61 class RecordAllocator { | 66 class RecordAllocator { |
| 62 public: | 67 public: |
| 63 // Construct an allocator for writing. | 68 // Construct an allocator for writing. |
| 64 RecordAllocator(base::PersistentMemoryAllocator* memory_allocator, | 69 RecordAllocator(base::PersistentMemoryAllocator* memory_allocator, |
| 65 size_t min_size); | 70 size_t min_size); |
| 66 | 71 |
| 67 // Construct an allocator for reading. | 72 // Construct an allocator for reading. |
| 68 RecordAllocator(const base::PersistentMemoryAllocator* memory_allocator); | 73 RecordAllocator(const base::PersistentMemoryAllocator* memory_allocator); |
| 69 | 74 |
| 70 // These methods manage writing records to the allocator. Do not mix these | 75 // These methods manage writing records to the allocator. Do not mix these |
| 71 // with "read" calls; it's one or the other. | 76 // with "read" calls; it's one or the other. |
| 72 void Reset(); | 77 void Reset(); |
| 73 bool Write(RecordType type, const std::string& record); | 78 bool Write(RecordType type, base::StringPiece record); |
| 74 | 79 |
| 75 // Read a record from the allocator. Do not mix this with "write" calls; | 80 // Read a record from the allocator. Do not mix this with "write" calls; |
| 76 // it's one or the other. | 81 // it's one or the other. |
| 77 bool HasMoreData() const; | 82 bool HasMoreData() const; |
| 78 bool Read(RecordType* type, std::string* record) const; | 83 bool Read(RecordType* type, std::string* record) const; |
| 79 | 84 |
| 80 base::PersistentMemoryAllocator* allocator() { return allocator_; } | 85 base::PersistentMemoryAllocator* allocator() { return allocator_; } |
| 81 | 86 |
| 82 bool has_complete_profile() { return has_complete_profile_; } | 87 bool has_complete_profile() { return has_complete_profile_; } |
| 83 void set_complete_profile() { has_complete_profile_ = true; } | 88 void set_complete_profile() { has_complete_profile_ = true; } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 107 bool has_complete_profile_; | 112 bool has_complete_profile_; |
| 108 | 113 |
| 109 // These change even though the underlying data may be "const". | 114 // These change even though the underlying data may be "const". |
| 110 mutable uint32_t alloc_reference_; // Last storage block. | 115 mutable uint32_t alloc_reference_; // Last storage block. |
| 111 mutable size_t alloc_size_; // Size of the block. | 116 mutable size_t alloc_size_; // Size of the block. |
| 112 mutable size_t end_offset_; // End of data in block. | 117 mutable size_t end_offset_; // End of data in block. |
| 113 | 118 |
| 114 // Copy and assign are allowed for easy use with STL containers. | 119 // Copy and assign are allowed for easy use with STL containers. |
| 115 }; | 120 }; |
| 116 | 121 |
| 122 // Write a record to all registered allocators. | |
| 123 void WriteToAll(RecordType type, base::StringPiece record); | |
| 124 | |
| 125 // Merges all extension records into a system profile. | |
| 126 static void MergeExtensionRecords( | |
|
Alexei Svitkine (slow)
2017/06/23 18:51:54
I don't like "extension" terminology here because
bcwhite
2017/06/28 14:25:35
Done.
| |
| 127 const base::PersistentMemoryAllocator& memory_allocator, | |
| 128 SystemProfileProto* system_profile); | |
| 129 | |
| 117 // The list of registered persistent allocators, described by RecordAllocator | 130 // The list of registered persistent allocators, described by RecordAllocator |
| 118 // instances. | 131 // instances. |
| 119 std::vector<RecordAllocator> allocators_; | 132 std::vector<RecordAllocator> allocators_; |
| 120 | 133 |
| 121 // Indicates if a complete profile has been stored to all allocators. | 134 // Indicates if a complete profile has been stored to all allocators. |
| 122 bool all_have_complete_profile_ = false; | 135 bool all_have_complete_profile_ = false; |
| 123 | 136 |
| 124 THREAD_CHECKER(thread_checker_); | 137 THREAD_CHECKER(thread_checker_); |
| 125 | 138 |
| 126 DISALLOW_COPY_AND_ASSIGN(PersistentSystemProfile); | 139 DISALLOW_COPY_AND_ASSIGN(PersistentSystemProfile); |
| 127 }; | 140 }; |
| 128 | 141 |
| 129 // A singleton instance of the above. | 142 // A singleton instance of the above. |
| 130 class GlobalPersistentSystemProfile : public PersistentSystemProfile { | 143 class GlobalPersistentSystemProfile : public PersistentSystemProfile { |
| 131 public: | 144 public: |
| 132 static GlobalPersistentSystemProfile* GetInstance(); | 145 static GlobalPersistentSystemProfile* GetInstance(); |
| 133 | 146 |
| 134 private: | 147 private: |
| 135 friend struct base::DefaultSingletonTraits<GlobalPersistentSystemProfile>; | 148 friend struct base::DefaultSingletonTraits<GlobalPersistentSystemProfile>; |
| 136 | 149 |
| 137 GlobalPersistentSystemProfile() {} | 150 GlobalPersistentSystemProfile() {} |
| 138 ~GlobalPersistentSystemProfile() {} | 151 ~GlobalPersistentSystemProfile() {} |
| 139 | 152 |
| 140 DISALLOW_COPY_AND_ASSIGN(GlobalPersistentSystemProfile); | 153 DISALLOW_COPY_AND_ASSIGN(GlobalPersistentSystemProfile); |
| 141 }; | 154 }; |
| 142 | 155 |
| 143 } // namespace metrics | 156 } // namespace metrics |
| 144 | 157 |
| 145 #endif // BASE_METRICS_PERSISTENT_SYSTEM_PROFILE_H_ | 158 #endif // BASE_METRICS_PERSISTENT_SYSTEM_PROFILE_H_ |
| OLD | NEW |