[M108 Migration][VD] Avoid pending frame counter becoming negative
[platform/framework/web/chromium-efl.git] / cc / metrics / events_metrics_manager.cc
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.
4
5 #include "cc/metrics/events_metrics_manager.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/callback.h"
11 #include "base/callback_helpers.h"
12 #include "base/memory/raw_ptr.h"
13
14 namespace cc {
15
16 class EventsMetricsManager::ScopedMonitorImpl
17     : public EventsMetricsManager::ScopedMonitor {
18  public:
19   ScopedMonitorImpl(EventsMetricsManager* manager, DoneCallback done_callback)
20       : manager_(manager), done_callback_(std::move(done_callback)) {
21     DCHECK(manager_);
22   }
23
24   ~ScopedMonitorImpl() override {
25     if (manager_)
26       End();
27   }
28
29   void End() {
30     DCHECK(manager_);
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);
35
36       // If `handled` is false, the callback should return nullptr.
37       DCHECK(handled || !metrics);
38     }
39     manager_->OnScopedMonitorEnded(std::move(metrics));
40     manager_ = nullptr;
41   }
42
43   // Overridden from EventsMetricsManager::ScopedMonitor.
44   void SetSaveMetrics() override { save_metrics_ = true; }
45
46  private:
47   raw_ptr<EventsMetricsManager> manager_;
48   DoneCallback done_callback_;
49   bool save_metrics_ = false;
50 };
51
52 EventsMetricsManager::ScopedMonitor::ScopedMonitor() = default;
53 EventsMetricsManager::ScopedMonitor::~ScopedMonitor() = default;
54
55 EventsMetricsManager::EventsMetricsManager() = default;
56
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();
62 }
63
64 std::unique_ptr<EventsMetricsManager::ScopedMonitor>
65 EventsMetricsManager::GetScopedMonitor(
66     ScopedMonitor::DoneCallback done_callback) {
67   auto monitor =
68       std::make_unique<ScopedMonitorImpl>(this, std::move(done_callback));
69   active_scoped_monitors_.push_back(monitor.get());
70   return monitor;
71 }
72
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();
79   }
80 }
81
82 EventMetrics::List EventsMetricsManager::TakeSavedEventsMetrics() {
83   EventMetrics::List result;
84   result.swap(saved_events_);
85   return result;
86 }
87
88 void EventsMetricsManager::OnScopedMonitorEnded(
89     std::unique_ptr<EventMetrics> metrics) {
90   DCHECK_GT(active_scoped_monitors_.size(), 0u);
91   active_scoped_monitors_.pop_back();
92
93   if (metrics)
94     saved_events_.push_back(std::move(metrics));
95 }
96
97 }  // namespace cc