Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(616)

Side by Side Diff: components/memory_pressure/memory_pressure_stats_collector.cc

Issue 1310043004: Create MemoryPressureStatsCollector. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Missed a comment. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
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 "components/memory_pressure/memory_pressure_stats_collector.h"
6
7 #include "base/metrics/histogram.h"
8 #include "base/time/tick_clock.h"
9
10 namespace memory_pressure {
11
12 namespace {
13
14 using MemoryPressureLevel = MemoryPressureListener::MemoryPressureLevel;
15
16 // Converts a memory pressure level to an UMA enumeration value.
17 MemoryPressureLevelUMA MemoryPressureLevelToUmaEnumValue(
18 MemoryPressureLevel level) {
19 switch (level) {
20 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
21 return UMA_MEMORY_PRESSURE_LEVEL_NONE;
22 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
23 return UMA_MEMORY_PRESSURE_LEVEL_MODERATE;
24 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
25 return UMA_MEMORY_PRESSURE_LEVEL_CRITICAL;
26 }
27 NOTREACHED();
28 return UMA_MEMORY_PRESSURE_LEVEL_NONE;
29 }
30
31 // Converts an UMA enumeration value to a memory pressure level.
32 MemoryPressureLevel MemoryPressureLevelFromUmaEnumValue(
33 MemoryPressureLevelUMA level) {
34 switch (level) {
35 case UMA_MEMORY_PRESSURE_LEVEL_NONE:
36 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
37 case UMA_MEMORY_PRESSURE_LEVEL_MODERATE:
38 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE;
39 case UMA_MEMORY_PRESSURE_LEVEL_CRITICAL:
40 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL;
41 case UMA_MEMORY_PRESSURE_LEVEL_COUNT:
42 NOTREACHED();
43 break;
44 }
45 NOTREACHED();
46 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
47 }
48
49 // Converts a pressure state change to an UMA enumeration value.
50 MemoryPressureLevelChangeUMA MemoryPressureLevelChangeToUmaEnumValue(
51 MemoryPressureLevel old_level,
52 MemoryPressureLevel new_level) {
53 switch (old_level) {
54 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: {
55 if (new_level == MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE)
56 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_NONE_TO_MODERATE;
57 if (new_level == MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL)
58 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_NONE_TO_CRITICAL;
59 // Should never happen. Fall through to the NOTREACHED below.
grt (UTC plus 2) 2015/09/08 19:22:10 nit: to me, "fall through" means fall through to t
chrisha 2015/09/08 19:57:53 Done.
60 break;
61 }
62 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: {
63 if (new_level == MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE)
64 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_MODERATE_TO_NONE;
65 if (new_level == MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL)
66 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_MODERATE_TO_CRITICAL;
67 // Should never happen. Fall through to the NOTREACHED below.
68 break;
69 }
70 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: {
71 if (new_level == MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE)
72 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_CRITICAL_TO_MODERATE;
73 if (new_level == MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE)
74 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_CRITICAL_TO_MODERATE;
75 // Should never happen. Fall through to the NOTREACHED below.
76 break;
77 }
78 }
79 NOTREACHED();
80 return UMA_MEMORY_PRESSURE_LEVEL_CHANGE_NONE_TO_MODERATE;
81 }
82
83 } // namespace
84
85 MemoryPressureStatsCollector::MemoryPressureStatsCollector(
86 base::TickClock* tick_clock)
87 : tick_clock_(tick_clock),
88 last_pressure_level_(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) {
89 }
90
91 void MemoryPressureStatsCollector::UpdateStatistics(
92 MemoryPressureLevel current_pressure_level) {
93 base::TimeTicks now = tick_clock_->NowTicks();
94
95 // Special case: first call to the collector. Observations have just started
96 // so there's nothing to report.
97 if (last_update_time_.is_null()) {
98 last_pressure_level_ = current_pressure_level;
99 last_update_time_ = now;
100 return;
101 }
102
103 // If the pressure level has transitioned then report this.
104 if (last_pressure_level_ != current_pressure_level)
105 ReportLevelChange(last_pressure_level_, current_pressure_level);
106
107 // Increment the appropriate cumulative bucket.
108 int index = MemoryPressureLevelToUmaEnumValue(current_pressure_level);
109 unreported_cumulative_time_[index] += now - last_update_time_;
110
111 // Update last pressure related state.
112 last_pressure_level_ = current_pressure_level;
113 last_update_time_ = now;
114
115 // Make reports about the amount of time spent cumulatively at each level.
116 for (size_t i = 0; i < arraysize(unreported_cumulative_time_); ++i) {
117 // Report the largest number of whole seconds possible at this moment and
118 // carry around the rest for a future report.
119 if (unreported_cumulative_time_[i].is_zero())
120 continue;
121 int64_t seconds = unreported_cumulative_time_[i].InSeconds();
122 if (seconds == 0)
123 continue;
124 unreported_cumulative_time_[i] -= base::TimeDelta::FromSeconds(seconds);
125
126 ReportCumulativeTime(MemoryPressureLevelFromUmaEnumValue(
127 static_cast<MemoryPressureLevelUMA>(i)),
128 static_cast<int>(seconds));
129 }
130 }
131
132 // static
133 void MemoryPressureStatsCollector::ReportCumulativeTime(
134 MemoryPressureLevel pressure_level,
135 int seconds) {
136 // Use the more primitive STATIC_HISTOGRAM_POINTER_BLOCK macro because the
137 // simple UMA_HISTOGRAM macros don't expose 'AddCount' functionality.
138 STATIC_HISTOGRAM_POINTER_BLOCK(
139 "Memory.PressureLevel",
140 AddCount(MemoryPressureLevelToUmaEnumValue(pressure_level), seconds),
141 base::LinearHistogram::FactoryGet(
142 "Memory.PressureLevel", 1, UMA_MEMORY_PRESSURE_LEVEL_COUNT,
143 UMA_MEMORY_PRESSURE_LEVEL_COUNT + 1,
144 base::HistogramBase::kUmaTargetedHistogramFlag));
145 }
146
147 // static
148 void MemoryPressureStatsCollector::ReportLevelChange(
149 MemoryPressureLevel old_pressure_level,
150 MemoryPressureLevel new_pressure_level) {
151 UMA_HISTOGRAM_ENUMERATION("Memory.PressureLevelChange",
152 MemoryPressureLevelChangeToUmaEnumValue(
153 old_pressure_level, new_pressure_level),
154 UMA_MEMORY_PRESSURE_LEVEL_CHANGE_COUNT);
155 }
156
157 } // namespace memory_pressure
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698