Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: components/metrics/persistent_system_profile.cc

Issue 2918533003: Send metrics with embedded system profiles after system startup. (Closed)
Patch Set: addressed final review comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "components/metrics/persistent_system_profile.h" 5 #include "components/metrics/persistent_system_profile.h"
6 6
7 #include "base/atomicops.h" 7 #include "base/atomicops.h"
8 #include "base/memory/singleton.h" 8 #include "base/memory/singleton.h"
9 #include "base/metrics/persistent_memory_allocator.h" 9 #include "base/metrics/persistent_memory_allocator.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 } 94 }
95 // Write out as much of the data as possible. |data| and |remaining_size| 95 // Write out as much of the data as possible. |data| and |remaining_size|
96 // are updated in place. 96 // are updated in place.
97 if (!WriteData(type, &data, &remaining_size)) 97 if (!WriteData(type, &data, &remaining_size))
98 return false; 98 return false;
99 } while (remaining_size > 0); 99 } while (remaining_size > 0);
100 100
101 return true; 101 return true;
102 } 102 }
103 103
104 bool PersistentSystemProfile::RecordAllocator::HasMoreData() const {
105 if (alloc_reference_ == 0 && !NextSegment())
106 return false;
107
108 char* block =
109 allocator_->GetAsArray<char>(alloc_reference_, kTypeIdSystemProfile,
110 base::PersistentMemoryAllocator::kSizeAny);
111 if (!block)
112 return false;
113
114 RecordHeader header;
115 header.as_atomic = base::subtle::Acquire_Load(
116 reinterpret_cast<base::subtle::Atomic32*>(block + end_offset_));
117 return header.as_parts.type != kUnusedSpace;
118 }
119
104 bool PersistentSystemProfile::RecordAllocator::Read(RecordType* type, 120 bool PersistentSystemProfile::RecordAllocator::Read(RecordType* type,
105 std::string* record) const { 121 std::string* record) const {
106 *type = kUnusedSpace; 122 *type = kUnusedSpace;
107 record->clear(); 123 record->clear();
108 124
109 // Access data and read records until everything has been loaded. 125 // Access data and read records until everything has been loaded.
110 while (true) { 126 while (true) {
111 if (end_offset_ == alloc_size_) { 127 if (end_offset_ == alloc_size_) {
112 if (!NextSegment()) 128 if (!NextSegment())
113 return false; 129 return false;
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 return; 285 return;
270 286
271 for (auto& allocator : allocators_) { 287 for (auto& allocator : allocators_) {
272 // A full system profile always starts fresh. 288 // A full system profile always starts fresh.
273 allocator.Reset(); 289 allocator.Reset();
274 // Write out the serialized profile. 290 // Write out the serialized profile.
275 allocator.Write(kSystemProfileProto, serialized_profile); 291 allocator.Write(kSystemProfileProto, serialized_profile);
276 } 292 }
277 } 293 }
278 294
295 void PersistentSystemProfile::SetSystemProfile(
296 const SystemProfileProto& profile) {
297 std::string serialized_profile;
298 if (!profile.SerializeToString(&serialized_profile))
299 return;
300 SetSystemProfile(serialized_profile);
301 }
302
303 // static
304 bool PersistentSystemProfile::HasSystemProfile(
305 const base::PersistentMemoryAllocator& memory_allocator) {
306 const RecordAllocator records(&memory_allocator);
307 return records.HasMoreData();
308 }
309
279 // static 310 // static
280 bool PersistentSystemProfile::GetSystemProfile( 311 bool PersistentSystemProfile::GetSystemProfile(
281 const base::PersistentMemoryAllocator& memory_allocator, 312 const base::PersistentMemoryAllocator& memory_allocator,
282 SystemProfileProto* system_profile) { 313 SystemProfileProto* system_profile) {
283 const RecordAllocator records(&memory_allocator); 314 const RecordAllocator records(&memory_allocator);
284 315
285 RecordType type; 316 RecordType type;
286 std::string record; 317 std::string record;
287 if (!records.Read(&type, &record)) 318 if (!records.Read(&type, &record))
288 return false; 319 return false;
289 if (type != kSystemProfileProto) 320 if (type != kSystemProfileProto)
290 return false; 321 return false;
291 322
292 return system_profile->ParseFromString(record); 323 return system_profile->ParseFromString(record);
293 } 324 }
294 325
295 GlobalPersistentSystemProfile* GlobalPersistentSystemProfile::GetInstance() { 326 GlobalPersistentSystemProfile* GlobalPersistentSystemProfile::GetInstance() {
296 return base::Singleton< 327 return base::Singleton<
297 GlobalPersistentSystemProfile, 328 GlobalPersistentSystemProfile,
298 base::LeakySingletonTraits<GlobalPersistentSystemProfile>>::get(); 329 base::LeakySingletonTraits<GlobalPersistentSystemProfile>>::get();
299 } 330 }
300 331
301 } // namespace metrics 332 } // namespace metrics
OLDNEW
« no previous file with comments | « components/metrics/persistent_system_profile.h ('k') | components/metrics/persistent_system_profile_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698