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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/compositor/compositor_metrics_tracker.h"
#include <utility>
#include "base/check.h"
#include "base/functional/callback.h"
#include "ui/compositor/compositor_metrics_tracker_host.h"
namespace ui {
CompositorMetricsTracker::CompositorMetricsTracker(
TrackerId id,
base::WeakPtr<CompositorMetricsTrackerHost> host)
: id_(id), host_(std::move(host)) {
DCHECK(host_);
}
CompositorMetricsTracker::CompositorMetricsTracker(
CompositorMetricsTracker&& other) {
*this = std::move(other);
}
CompositorMetricsTracker& CompositorMetricsTracker::operator=(
CompositorMetricsTracker&& other) {
id_ = other.id_;
host_ = std::move(other.host_);
state_ = other.state_;
other.id_ = kInvalidId;
other.host_.reset();
other.state_ = State::kNotStarted;
return *this;
}
CompositorMetricsTracker::~CompositorMetricsTracker() {
// Auto cancel if `Stop()` is not called.
if (state_ == State::kStarted) {
Cancel();
}
}
void CompositorMetricsTracker::Start(
CompositorMetricsTrackerHost::ReportCallback callback) {
// Start after `host_` destruction is likely an error.
DCHECK(host_);
DCHECK_EQ(state_, State::kNotStarted);
state_ = State::kStarted;
host_->StartMetricsTracker(id_, std::move(callback));
}
bool CompositorMetricsTracker::Stop() {
DCHECK_EQ(state_, State::kStarted);
if (host_ && host_->StopMetricsTracker(id_)) {
state_ = State::kWaitForReport;
return true;
}
// No data will be reported. This could happen when gpu process crashed.
// Treat the case as `kCanceled`.
state_ = State::kCanceled;
return false;
}
void CompositorMetricsTracker::Cancel() {
// Some code calls `Cancel()` indirectly after receiving report. Allow this to
// happen and make it a no-op. See https://crbug.com/1193382.
if (state_ != State::kStarted) {
return;
}
CancelReport();
}
void CompositorMetricsTracker::CancelReport() {
// Report is only possible in `kStarted` and `kWaitForReport` state.
if (state_ != State::kStarted && state_ != State::kWaitForReport) {
return;
}
state_ = State::kCanceled;
if (host_) {
host_->CancelMetricsTracker(id_);
}
}
} // namespace ui
|