1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/metrics/shutdown_watcher_helper.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/metrics/thread_watcher_report_hang.h"
#include "chrome/common/channel_info.h"
#include "components/version_info/channel.h"
// TODO(crbug.com/40267942): This code is not related to the metrics
// infrastructure and should be moved to a new home.
// ShutdownWatcherHelper is not available on Android.
#if !BUILDFLAG(IS_ANDROID)
namespace {
base::TimeDelta GetPerChannelTimeout(base::TimeDelta duration) {
base::TimeDelta actual_duration = duration;
// TODO(crbug.com/40267942): These timeouts were set based on historical
// values, but should be revisited. See discussion in
// https://crrev.com/c/4527815/comments/baea15f7_98f5a0e9
//
// In particular, `Arm` is called with a 5 minute timeout, which translates
// to an extremely long 100 minute shutdown timeout on stable. This is long
// enough that we effectively are not looking for shutdown hangs on stable at
// all.
version_info::Channel channel = chrome::GetChannel();
if (channel == version_info::Channel::STABLE) {
actual_duration *= 20;
} else if (channel == version_info::Channel::BETA) {
actual_duration *= 10;
} else if (channel == version_info::Channel::DEV) {
actual_duration *= 4;
} else {
actual_duration *= 2;
}
return actual_duration;
}
} // namespace
ShutdownWatcherHelper::ShutdownWatcherHelper() = default;
ShutdownWatcherHelper::~ShutdownWatcherHelper() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
void ShutdownWatcherHelper::Arm(const base::TimeDelta& duration) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!shutdown_watchdog_);
shutdown_watchdog_.emplace(GetPerChannelTimeout(duration),
"Shutdown watchdog thread", true, this);
shutdown_watchdog_->Arm();
}
void ShutdownWatcherHelper::Alarm() {
metrics::ShutdownHang();
}
#endif // !BUILDFLAG(IS_ANDROID)
|