| Index: chrome/installer/setup/installer_metrics.cc
|
| diff --git a/chrome/installer/setup/installer_metrics.cc b/chrome/installer/setup/installer_metrics.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e60ccff26495bc1d8392de1d6394873382c6e7a
|
| --- /dev/null
|
| +++ b/chrome/installer/setup/installer_metrics.cc
|
| @@ -0,0 +1,56 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/installer/setup/installer_metrics.h"
|
| +
|
| +#include "base/files/file.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/files/file_util.h"
|
| +#include "base/metrics/histogram_base.h"
|
| +#include "base/metrics/histogram_persistence.h"
|
| +#include "base/metrics/persistent_memory_allocator.h"
|
| +
|
| +namespace installer {
|
| +
|
| +void BeginPersistentHistogramStorage(const char* name) {
|
| + base::SetPersistentHistogramMemoryAllocator(
|
| + new base::LocalPersistentMemoryAllocator(1 << 20, 0, name)); // 1 MiB
|
| + base::GetPersistentHistogramMemoryAllocator()->CreateTrackingHistograms(name);
|
| +}
|
| +
|
| +void EndPersistentHistogramStorage(const base::FilePath& target_path) {
|
| + // For atomicity, first write to a temporary file and then rename it.
|
| + // The ImportantFileWriter would be good for this except it supports only
|
| + // std::string for its data.
|
| + base::PersistentMemoryAllocator* allocator =
|
| + base::GetPersistentHistogramMemoryAllocator();
|
| + allocator->UpdateTrackingHistograms();
|
| +
|
| + base::FilePath file_path = target_path
|
| + .AppendASCII(allocator->Name())
|
| + .AddExtension(L".pma");
|
| + base::FilePath tmp_file_path;
|
| + base::DeleteFile(file_path, false);
|
| +
|
| + if (base::CreateTemporaryFileInDir(file_path.DirName(), &tmp_file_path)) {
|
| + base::File histograms(tmp_file_path,
|
| + base::File::FLAG_OPEN | base::File::FLAG_WRITE);
|
| + if (histograms.IsValid()) {
|
| + size_t used = static_cast<int>(allocator->used());
|
| + if (histograms.Write(0, static_cast<const char*>(allocator->data()),
|
| + used) == used &&
|
| + histograms.Flush()) {
|
| + histograms.Close();
|
| + if (base::ReplaceFile(tmp_file_path, file_path, nullptr)) {
|
| + VLOG(1) << "Persistent histograms saved in file: "
|
| + << file_path.value();
|
| + }
|
| + }
|
| + histograms.Close();
|
| + }
|
| + base::DeleteFile(tmp_file_path, false);
|
| + }
|
| +}
|
| +
|
| +} // namespace installer
|
|
|