Index: components/browser_watcher/crash_reporting_metrics_win.cc |
diff --git a/components/browser_watcher/crash_reporting_metrics_win.cc b/components/browser_watcher/crash_reporting_metrics_win.cc |
deleted file mode 100644 |
index 7c4dd84198f26dbea429804d11cef28f252b95c9..0000000000000000000000000000000000000000 |
--- a/components/browser_watcher/crash_reporting_metrics_win.cc |
+++ /dev/null |
@@ -1,164 +0,0 @@ |
-// Copyright 2015 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 "components/browser_watcher/crash_reporting_metrics_win.h" |
- |
-#include <stddef.h> |
- |
-#include <algorithm> |
-#include "base/atomicops.h" |
-#include "base/guid.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/strings/safe_sprintf.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/win/registry.h" |
- |
-namespace browser_watcher { |
- |
-namespace { |
- |
-// The prior implementation used 0 and 1. Its data collection is inconsistent |
-// with ours and it's best to just ignore its records. So we start at 2. |
-const DWORD kCrashDumpAttempt = 2; |
-const DWORD kDumpWithoutCrashAttempt = 3; |
-const DWORD kCrashDumpSuccess = 4; |
-const DWORD kCrashDumpFailure = 5; |
-const DWORD kDumpWithoutCrashSuccess = 6; |
-const DWORD kDumpWithoutCrashFailure = 7; |
- |
-// A prefix intended to avoid registry value name collisions with other |
-// processes (or modules within a single process). It is not necessary for the |
-// reading and writing instances to share the prefix value. This array is sized |
-// to hold a null-terminated string as generated by base::GenerateGUID. |
-char g_unique_prefix[36 + 1] = {0}; |
- |
-// An atomic counter intended to make each registry value name unique within |
-// this process and module. |
-base::subtle::Atomic32 g_record_count = 0; |
- |
-// The length of a null-terminated string consisting of "{GUID}-{COUNT}". |
-const size_t kValueNameSize = 36 + 1 + 8 + 1; |
- |
-void WriteValue(const base::string16& key_path, DWORD value) { |
- // Generate the final value name we'll use (appends the crash number to the |
- // base value name). |
- char value_name_ascii[kValueNameSize] = ""; |
- base::char16 value_name_utf16[kValueNameSize] = L""; |
- |
- if (base::strings::SafeSPrintf( |
- value_name_ascii, "%s-%x", g_unique_prefix, |
- base::subtle::NoBarrier_AtomicIncrement(&g_record_count, 1)) <= 0) { |
- NOTREACHED(); |
- } else { |
- // Since it's an ASCII string, the UTF-16 form is identical with leading 0 |
- // bytes. We're avoiding unnecessary heap operations since we're running in |
- // a compromised process. |
- std::copy(value_name_ascii, value_name_ascii + kValueNameSize, |
- value_name_utf16); |
- |
- base::win::RegKey reg_key; |
- if (reg_key.Create(HKEY_CURRENT_USER, key_path.c_str(), KEY_SET_VALUE) != |
- ERROR_SUCCESS) { |
- NOTREACHED(); |
- } else { |
- reg_key.WriteValue(value_name_utf16, value); |
- } |
- } |
- |
-} |
- |
-} // namespace |
- |
-CrashReportingMetrics::CrashReportingMetrics( |
- const base::string16& registry_path) |
- : registry_path_(registry_path) { |
- if (g_unique_prefix[0] == 0) { |
- std::string guid = base::GenerateGUID(); |
- // It seems reasonable to assume that the worst possible outcome of two |
- // separate threads trying to do the following would be to store a GUID |
- // value that is a hybrid of the two intended values. Hence we can avoid any |
- // thread-safety caveats in our public API. |
- size_t copied_size = base::strlcpy(g_unique_prefix, guid.c_str(), |
- arraysize(g_unique_prefix)); |
- DCHECK_EQ(copied_size, guid.length()); |
- } |
-} |
- |
-void CrashReportingMetrics::RecordCrashDumpAttempt() { |
- WriteValue(registry_path_, kCrashDumpAttempt); |
-} |
- |
-void CrashReportingMetrics::RecordDumpWithoutCrashAttempt() { |
- WriteValue(registry_path_, kDumpWithoutCrashAttempt); |
-} |
-void CrashReportingMetrics::RecordCrashDumpAttemptResult(bool succeeded) { |
- WriteValue(registry_path_, succeeded ? kCrashDumpSuccess : kCrashDumpFailure); |
-} |
-void CrashReportingMetrics::RecordDumpWithoutCrashAttemptResult( |
- bool succeeded) { |
- WriteValue(registry_path_, |
- succeeded ? kDumpWithoutCrashSuccess : kDumpWithoutCrashFailure); |
-} |
- |
-CrashReportingMetrics::Values CrashReportingMetrics::RetrieveAndResetMetrics() { |
- Values values = {0}; |
- |
- // Open the registry key for iteration. |
- base::win::RegKey regkey; |
- if (regkey.Open(HKEY_CURRENT_USER, registry_path_.c_str(), |
- KEY_QUERY_VALUE | KEY_SET_VALUE) != ERROR_SUCCESS) { |
- return values; |
- } |
- |
- // Track a list of values to delete. We don't modify the registry key while |
- // we're iterating over its values. |
- typedef std::vector<base::string16> StringVector; |
- StringVector to_delete; |
- |
- // Iterate over the values in the key counting dumps with and without crashes. |
- // We directly walk the values instead of using RegistryValueIterator in order |
- // to read all of the values as DWORDS instead of strings. |
- base::string16 name; |
- DWORD value = 0; |
- for (int i = regkey.GetValueCount() - 1; i >= 0; --i) { |
- if (regkey.GetValueNameAt(i, &name) == ERROR_SUCCESS && |
- regkey.ReadValueDW(name.c_str(), &value) == ERROR_SUCCESS) { |
- to_delete.push_back(name); |
- switch (value) { |
- case kCrashDumpAttempt: |
- ++values.crash_dump_attempts; |
- break; |
- case kCrashDumpSuccess: |
- ++values.successful_crash_dumps; |
- break; |
- case kCrashDumpFailure: |
- ++values.failed_crash_dumps; |
- break; |
- case kDumpWithoutCrashAttempt: |
- ++values.dump_without_crash_attempts; |
- break; |
- case kDumpWithoutCrashSuccess: |
- ++values.successful_dumps_without_crash; |
- break; |
- case kDumpWithoutCrashFailure: |
- ++values.failed_dumps_without_crash; |
- break; |
- default: |
- // Presumably a pre-existing record from the previous implementation. |
- // We will delete it. |
- break; |
- } |
- } |
- } |
- |
- // Delete the registry keys we've just counted. |
- for (const auto& value_name : to_delete) |
- regkey.DeleteValue(value_name.c_str()); |
- |
- return values; |
-} |
- |
-} // namespace browser_watcher |