1 // Copyright 2020 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/metrics/events_metrics_manager.h"
10 #include "base/callback.h"
11 #include "base/callback_helpers.h"
12 #include "base/memory/raw_ptr.h"
16 class EventsMetricsManager::ScopedMonitorImpl
17 : public EventsMetricsManager::ScopedMonitor {
19 ScopedMonitorImpl(EventsMetricsManager* manager, DoneCallback done_callback)
20 : manager_(manager), done_callback_(std::move(done_callback)) {
24 ~ScopedMonitorImpl() override {
31 std::unique_ptr<EventMetrics> metrics;
32 if (!done_callback_.is_null()) {
33 const bool handled = save_metrics_;
34 metrics = std::move(done_callback_).Run(handled);
36 // If `handled` is false, the callback should return nullptr.
37 DCHECK(handled || !metrics);
39 manager_->OnScopedMonitorEnded(std::move(metrics));
43 // Overridden from EventsMetricsManager::ScopedMonitor.
44 void SetSaveMetrics() override { save_metrics_ = true; }
47 raw_ptr<EventsMetricsManager> manager_;
48 DoneCallback done_callback_;
49 bool save_metrics_ = false;
52 EventsMetricsManager::ScopedMonitor::ScopedMonitor() = default;
53 EventsMetricsManager::ScopedMonitor::~ScopedMonitor() = default;
55 EventsMetricsManager::EventsMetricsManager() = default;
57 EventsMetricsManager::~EventsMetricsManager() {
58 // If `EventsMetricsManager` is shut down while events are active, end active
59 // scoped monitors immediately.
60 while (!active_scoped_monitors_.empty())
61 active_scoped_monitors_.back()->End();
64 std::unique_ptr<EventsMetricsManager::ScopedMonitor>
65 EventsMetricsManager::GetScopedMonitor(
66 ScopedMonitor::DoneCallback done_callback) {
68 std::make_unique<ScopedMonitorImpl>(this, std::move(done_callback));
69 active_scoped_monitors_.push_back(monitor.get());
73 void EventsMetricsManager::SaveActiveEventMetrics() {
74 if (active_scoped_monitors_.size() > 0) {
75 // Here we just set the flag to save the active metrics. The actual saving
76 // happens when the scoped monitor is destroyed to give clients opportunity
77 // to use/update the metrics object until the end of their processing.
78 active_scoped_monitors_.back()->SetSaveMetrics();
82 EventMetrics::List EventsMetricsManager::TakeSavedEventsMetrics() {
83 EventMetrics::List result;
84 result.swap(saved_events_);
88 void EventsMetricsManager::OnScopedMonitorEnded(
89 std::unique_ptr<EventMetrics> metrics) {
90 DCHECK_GT(active_scoped_monitors_.size(), 0u);
91 active_scoped_monitors_.pop_back();
94 saved_events_.push_back(std::move(metrics));