| Index: components/browser_watcher/stability_paths.cc
|
| diff --git a/components/browser_watcher/stability_paths.cc b/components/browser_watcher/stability_paths.cc
|
| index 66805fa67d12381e81386de3e803adc59aa35f28..329d89c36a2d854daf466cd868658525a0e0cb2b 100644
|
| --- a/components/browser_watcher/stability_paths.cc
|
| +++ b/components/browser_watcher/stability_paths.cc
|
| @@ -8,20 +8,30 @@
|
| #include <windows.h>
|
| #endif // defined(OS_WIN)
|
|
|
| +#include <memory>
|
| #include <string>
|
| +#include <utility>
|
|
|
| +#include "base/debug/activity_tracker.h"
|
| #include "base/feature_list.h"
|
| #include "base/files/file.h"
|
| +#include "base/files/memory_mapped_file.h"
|
| #include "base/metrics/persistent_memory_allocator.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/time/time.h"
|
| #include "components/browser_watcher/features.h"
|
| +#include "components/browser_watcher/stability_metrics.h"
|
|
|
| #if defined(OS_WIN)
|
|
|
| #include "third_party/crashpad/crashpad/util/win/time.h"
|
|
|
| namespace browser_watcher {
|
| +
|
| +using base::FilePersistentMemoryAllocator;
|
| +using base::MemoryMappedFile;
|
| +using base::PersistentMemoryAllocator;
|
| +
|
| namespace {
|
|
|
| bool GetCreationTime(const base::Process& process, FILETIME* creation_time) {
|
| @@ -30,6 +40,21 @@ bool GetCreationTime(const base::Process& process, FILETIME* creation_time) {
|
| &ignore) != 0;
|
| }
|
|
|
| +bool SetPmaFileDeleted(const base::FilePath& file_path) {
|
| + // Map the file read-write so it can guarantee consistency between
|
| + // the analyzer and any trackers that may still be active.
|
| + std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
|
| + mmfile->Initialize(file_path, MemoryMappedFile::READ_WRITE);
|
| + if (!mmfile->IsValid())
|
| + return false;
|
| + if (!FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, true))
|
| + return false;
|
| + FilePersistentMemoryAllocator allocator(std::move(mmfile), 0, 0,
|
| + base::StringPiece(), true);
|
| + allocator.SetMemoryState(PersistentMemoryAllocator::MEMORY_DELETED);
|
| + return true;
|
| +}
|
| +
|
| } // namespace
|
|
|
| base::FilePath GetStabilityDir(const base::FilePath& user_data_dir) {
|
| @@ -72,25 +97,40 @@ base::FilePath::StringType GetStabilityFilePattern() {
|
| base::PersistentMemoryAllocator::kFileExtension;
|
| }
|
|
|
| -void MarkStabilityFileForDeletion(const base::FilePath& user_data_dir) {
|
| - if (!base::FeatureList::IsEnabled(
|
| - browser_watcher::kStabilityDebuggingFeature)) {
|
| - return;
|
| - }
|
| +void MarkOwnStabilityFileDeleted(const base::FilePath& user_data_dir) {
|
| + base::debug::GlobalActivityTracker* global_tracker =
|
| + base::debug::GlobalActivityTracker::Get();
|
| + if (!global_tracker)
|
| + return; // No stability instrumentation.
|
| +
|
| + global_tracker->MarkDeleted();
|
| + LogStabilityRecordEvent(StabilityRecordEvent::kMarkDeleted);
|
|
|
| + // Open (with delete) and then immediately close the file by going out of
|
| + // scope. This should cause the stability debugging file to be deleted prior
|
| + // to the next execution.
|
| base::FilePath stability_file;
|
| if (!GetStabilityFileForProcess(base::Process::Current(), user_data_dir,
|
| &stability_file)) {
|
| - // TODO(manzagop): add a metric for this.
|
| return;
|
| }
|
| + LogStabilityRecordEvent(StabilityRecordEvent::kMarkDeletedGotFile);
|
|
|
| - // Open (with delete) and then immediately close the file by going out of
|
| - // scope. This should cause the stability debugging file to be deleted prior
|
| - // to the next execution.
|
| - base::File file(stability_file, base::File::FLAG_OPEN |
|
| - base::File::FLAG_READ |
|
| - base::File::FLAG_DELETE_ON_CLOSE);
|
| + base::File deleter(stability_file, base::File::FLAG_OPEN |
|
| + base::File::FLAG_READ |
|
| + base::File::FLAG_DELETE_ON_CLOSE);
|
| + if (!deleter.IsValid())
|
| + LogStabilityRecordEvent(StabilityRecordEvent::kOpenForDeleteFailed);
|
| +}
|
| +
|
| +void MarkStabilityFileDeletedOnCrash(const base::FilePath& file_path) {
|
| + if (!SetPmaFileDeleted(file_path))
|
| + LogCollectOnCrashEvent(CollectOnCrashEvent::kPmaSetDeletedFailed);
|
| +
|
| + base::File deleter(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
|
| + base::File::FLAG_DELETE_ON_CLOSE);
|
| + if (!deleter.IsValid())
|
| + LogCollectOnCrashEvent(CollectOnCrashEvent::kOpenForDeleteFailed);
|
| }
|
|
|
| } // namespace browser_watcher
|
|
|