OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/memory_pressure_monitor_win.h" | 5 #include "base/memory/memory_pressure_monitor_win.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 | 8 |
9 #include "base/metrics/histogram_macros.h" | |
10 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
11 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
12 #include "base/time/time.h" | 11 #include "base/time/time.h" |
13 | 12 |
14 namespace base { | 13 namespace base { |
15 namespace win { | 14 namespace win { |
16 | 15 |
17 namespace { | 16 namespace { |
18 | 17 |
19 static const DWORDLONG kMBBytes = 1024 * 1024; | 18 static const DWORDLONG kMBBytes = 1024 * 1024; |
20 | 19 |
21 // Enumeration of UMA memory pressure levels. This needs to be kept in sync with | |
22 // histograms.xml and the memory pressure levels defined in | |
23 // MemoryPressureListener. | |
24 enum MemoryPressureLevelUMA { | |
25 UMA_MEMORY_PRESSURE_LEVEL_NONE = 0, | |
26 UMA_MEMORY_PRESSURE_LEVEL_MODERATE = 1, | |
27 UMA_MEMORY_PRESSURE_LEVEL_CRITICAL = 2, | |
28 // This must be the last value in the enum. | |
29 UMA_MEMORY_PRESSURE_LEVEL_COUNT, | |
30 }; | |
31 | |
32 // Converts a memory pressure level to an UMA enumeration value. | |
33 MemoryPressureLevelUMA MemoryPressureLevelToUmaEnumValue( | |
34 MemoryPressureListener::MemoryPressureLevel level) { | |
35 switch (level) { | |
36 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: | |
37 return UMA_MEMORY_PRESSURE_LEVEL_NONE; | |
38 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: | |
39 return UMA_MEMORY_PRESSURE_LEVEL_MODERATE; | |
40 case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: | |
41 return UMA_MEMORY_PRESSURE_LEVEL_CRITICAL; | |
42 } | |
43 NOTREACHED(); | |
44 return UMA_MEMORY_PRESSURE_LEVEL_NONE; | |
45 } | |
46 | |
47 } // namespace | 20 } // namespace |
48 | 21 |
49 // The following constants have been lifted from similar values in the ChromeOS | 22 // The following constants have been lifted from similar values in the ChromeOS |
50 // memory pressure monitor. The values were determined experimentally to ensure | 23 // memory pressure monitor. The values were determined experimentally to ensure |
51 // sufficient responsiveness of the memory pressure subsystem, and minimal | 24 // sufficient responsiveness of the memory pressure subsystem, and minimal |
52 // overhead. | 25 // overhead. |
53 const int MemoryPressureMonitor::kPollingIntervalMs = 5000; | 26 const int MemoryPressureMonitor::kPollingIntervalMs = 5000; |
54 const int MemoryPressureMonitor::kModeratePressureCooldownMs = 10000; | 27 const int MemoryPressureMonitor::kModeratePressureCooldownMs = 10000; |
55 const int MemoryPressureMonitor::kModeratePressureCooldownCycles = | 28 const int MemoryPressureMonitor::kModeratePressureCooldownCycles = |
56 kModeratePressureCooldownMs / kPollingIntervalMs; | 29 kModeratePressureCooldownMs / kPollingIntervalMs; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 DCHECK_NE(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, | 176 DCHECK_NE(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, |
204 current_memory_pressure_level_); | 177 current_memory_pressure_level_); |
205 dispatch_callback_.Run(current_memory_pressure_level_); | 178 dispatch_callback_.Run(current_memory_pressure_level_); |
206 } | 179 } |
207 | 180 |
208 void MemoryPressureMonitor::CheckMemoryPressureAndRecordStatistics() { | 181 void MemoryPressureMonitor::CheckMemoryPressureAndRecordStatistics() { |
209 DCHECK(thread_checker_.CalledOnValidThread()); | 182 DCHECK(thread_checker_.CalledOnValidThread()); |
210 | 183 |
211 CheckMemoryPressure(); | 184 CheckMemoryPressure(); |
212 | 185 |
213 UMA_HISTOGRAM_ENUMERATION( | 186 RecordMemoryPressure(current_memory_pressure_level_, 1); |
214 "Memory.PressureLevel", | |
215 MemoryPressureLevelToUmaEnumValue(current_memory_pressure_level_), | |
216 UMA_MEMORY_PRESSURE_LEVEL_COUNT); | |
217 } | 187 } |
218 | 188 |
219 MemoryPressureListener::MemoryPressureLevel | 189 MemoryPressureListener::MemoryPressureLevel |
220 MemoryPressureMonitor::CalculateCurrentPressureLevel() { | 190 MemoryPressureMonitor::CalculateCurrentPressureLevel() { |
221 MEMORYSTATUSEX mem_status = {}; | 191 MEMORYSTATUSEX mem_status = {}; |
222 if (!GetSystemMemoryStatus(&mem_status)) | 192 if (!GetSystemMemoryStatus(&mem_status)) |
223 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; | 193 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
224 | 194 |
225 // How much system memory is actively available for use right now, in MBs. | 195 // How much system memory is actively available for use right now, in MBs. |
226 int phys_free = static_cast<int>(mem_status.ullAvailPhys / kMBBytes); | 196 int phys_free = static_cast<int>(mem_status.ullAvailPhys / kMBBytes); |
(...skipping 27 matching lines...) Expand all Loading... |
254 return true; | 224 return true; |
255 } | 225 } |
256 | 226 |
257 void MemoryPressureMonitor::SetDispatchCallback( | 227 void MemoryPressureMonitor::SetDispatchCallback( |
258 const DispatchCallback& callback) { | 228 const DispatchCallback& callback) { |
259 dispatch_callback_ = callback; | 229 dispatch_callback_ = callback; |
260 } | 230 } |
261 | 231 |
262 } // namespace win | 232 } // namespace win |
263 } // namespace base | 233 } // namespace base |
OLD | NEW |