blob: 5bdc0787dd3df2340441462866a5ece953df2f61 [file] [log] [blame]
// Copyright (c) 2020 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 "third_party/blink/renderer/modules/peerconnection/thermal_uma_listener.h"
#include <memory>
#include <utility>
#include "base/memory/scoped_refptr.h"
#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
#include "base/sequenced_task_runner.h"
#include "third_party/blink/public/mojom/peerconnection/peer_connection_tracker.mojom-blink.h"
namespace blink {
namespace {
const base::TimeDelta kStatsReportingPeriod = base::TimeDelta::FromMinutes(1);
enum class ThermalStateUMA {
kNominal = 0,
kFair = 1,
kSerious = 2,
kCritical = 3,
kMaxValue = kCritical,
};
ThermalStateUMA ToThermalStateUMA(mojom::blink::DeviceThermalState state) {
switch (state) {
case mojom::blink::DeviceThermalState::kNominal:
return ThermalStateUMA::kNominal;
case mojom::blink::DeviceThermalState::kFair:
return ThermalStateUMA::kFair;
case mojom::blink::DeviceThermalState::kSerious:
return ThermalStateUMA::kSerious;
case mojom::blink::DeviceThermalState::kCritical:
return ThermalStateUMA::kCritical;
default:
NOTREACHED();
return ThermalStateUMA::kNominal;
}
}
} // namespace
// static
std::unique_ptr<ThermalUmaListener> ThermalUmaListener::Create(
scoped_refptr<base::SequencedTaskRunner> task_runner) {
std::unique_ptr<ThermalUmaListener> listener =
std::make_unique<ThermalUmaListener>(std::move(task_runner));
listener->ScheduleReport();
return listener;
}
ThermalUmaListener::ThermalUmaListener(
scoped_refptr<base::SequencedTaskRunner> task_runner)
: task_runner_(std::move(task_runner)),
current_thermal_state_(mojom::blink::DeviceThermalState::kUnknown),
weak_ptr_factor_(this) {
DCHECK(task_runner_);
}
void ThermalUmaListener::OnThermalMeasurement(
mojom::blink::DeviceThermalState measurement) {
base::AutoLock crit(lock_);
current_thermal_state_ = measurement;
}
void ThermalUmaListener::ScheduleReport() {
task_runner_->PostDelayedTask(FROM_HERE,
base::BindOnce(&ThermalUmaListener::ReportStats,
weak_ptr_factor_.GetWeakPtr()),
kStatsReportingPeriod);
}
void ThermalUmaListener::ReportStats() {
{
base::AutoLock crit(lock_);
if (current_thermal_state_ != mojom::blink::DeviceThermalState::kUnknown) {
UMA_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.ThermalState",
ToThermalStateUMA(current_thermal_state_));
}
}
ScheduleReport();
}
} // namespace blink