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

Side by Side Diff: base/chromeos/memory_pressure_observer_chromeos.cc

Issue 815183002: Using the new MemoryPressureListener instead of the LowMemoryObserver when the enhanced memory mana… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added unit test for memory_pressure_observer_chromeos and addressed Created 6 years 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/chromeos/memory_pressure_observer_chromeos.h" 5 #include "base/chromeos/memory_pressure_observer_chromeos.h"
6 6
7 #include "base/message_loop/message_loop.h"
7 #include "base/process/process_metrics.h" 8 #include "base/process/process_metrics.h"
8 #include "base/time/time.h" 9 #include "base/time/time.h"
9 10
10 namespace base { 11 namespace base {
11 12
12 namespace { 13 namespace {
13 14
14 // The time between memory pressure checks. 15 // The time between memory pressure checks. While under critical pressure, this
16 // is also the timer to repeat cleanup attempts.
15 const int kMemoryPressureIntervalInMS = 1000; 17 const int kMemoryPressureIntervalInMS = 1000;
James Cook 2014/12/20 00:27:46 nit: I would rename to kMemoryPressureIntervalMs f
Mr4D (OOO till 08-26) 2014/12/20 03:01:04 Done.
16 18
19 // The time which should pass between two moderate memory pressure calls.
20 const int kModerateMemoryPressureCooldownMs = 10000;
21
22 // Number of event polls before the next moderate pressure event can be sent.
23 const int kModerateMemoryPressureCooldown =
24 kModerateMemoryPressureCooldownMs / kMemoryPressureIntervalInMS;
25
26 // Threshold constants to emit pressure events.
27 const int kMemoryPressureModerateThresholdPercent = 70;
28 const int kMemoryPressureCriticalThresholdPercent = 90;
29
17 // Converts free percent of memory into a memory pressure value. 30 // Converts free percent of memory into a memory pressure value.
18 MemoryPressureListener::MemoryPressureLevel GetMemoryPressureLevelFromFillLevel( 31 MemoryPressureListener::MemoryPressureLevel GetMemoryPressureLevelFromFillLevel(
19 int memory_fill_level) { 32 int memory_fill_level) {
20 if (memory_fill_level < 70) 33 if (memory_fill_level < kMemoryPressureModerateThresholdPercent)
21 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; 34 return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
22 return memory_fill_level < 90 ? 35 return memory_fill_level < kMemoryPressureCriticalThresholdPercent ?
23 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE : 36 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE :
24 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL; 37 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL;
25 } 38 }
26 39
27 // Gets the used ChromeOS memory in percent. 40 // Gets the used ChromeOS memory in percent.
28 int GetUsedMemoryInPercent() { 41 int GetUsedMemoryInPercent() {
29 base::SystemMemoryInfoKB info; 42 base::SystemMemoryInfoKB info;
30 if (!base::GetSystemMemoryInfo(&info)) { 43 if (!base::GetSystemMemoryInfo(&info)) {
31 VLOG(1) << "Cannot determine the free memory of the system."; 44 VLOG(1) << "Cannot determine the free memory of the system.";
32 return 0; 45 return 0;
(...skipping 26 matching lines...) Expand all
59 72
60 DCHECK(available_memory < total_memory); 73 DCHECK(available_memory < total_memory);
61 int percentage = ((total_memory - available_memory) * 100) / total_memory; 74 int percentage = ((total_memory - available_memory) * 100) / total_memory;
62 return percentage; 75 return percentage;
63 } 76 }
64 77
65 } // namespace 78 } // namespace
66 79
67 MemoryPressureObserverChromeOS::MemoryPressureObserverChromeOS() 80 MemoryPressureObserverChromeOS::MemoryPressureObserverChromeOS()
68 : current_memory_pressure_level_( 81 : current_memory_pressure_level_(
69 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { 82 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE),
83 used_memory_in_percent_(GetUsedMemoryInPercent),
James Cook 2014/12/20 00:27:46 Instead of doing this you could rename the functio
Mr4D (OOO till 08-26) 2014/12/20 03:01:04 Oh my. I must have been blind. In deed! Done!
84 moderate_pressure_repeat_count_(0),
85 weak_ptr_factory_(this) {
70 StartObserving(); 86 StartObserving();
71 } 87 }
72 88
73 MemoryPressureObserverChromeOS::~MemoryPressureObserverChromeOS() { 89 MemoryPressureObserverChromeOS::~MemoryPressureObserverChromeOS() {
74 StopObserving(); 90 StopObserving();
75 } 91 }
76 92
93 void MemoryPressureObserverChromeOS::ScheduleEarlyCheck() {
94 MessageLoop::current()->PostTask(
95 FROM_HERE,
96 Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure,
97 weak_ptr_factory_.GetWeakPtr()));
98 }
99
100 void
101 MemoryPressureObserverChromeOS::SetGetUsedMemoryInPercentCallbackForUnittest(
102 MemoryPressureObserverChromeOS::GetUsedMemoryInPercentCallback callback) {
103 DCHECK(callback);
104 used_memory_in_percent_ = callback;
105 }
106
77 void MemoryPressureObserverChromeOS::StartObserving() { 107 void MemoryPressureObserverChromeOS::StartObserving() {
78 timer_.Start(FROM_HERE, 108 timer_.Start(FROM_HERE,
79 base::TimeDelta::FromMilliseconds(kMemoryPressureIntervalInMS), 109 TimeDelta::FromMilliseconds(kMemoryPressureIntervalInMS),
80 base::Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure, 110 Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure,
81 base::Unretained(this))); 111 weak_ptr_factory_.GetWeakPtr()));
82 } 112 }
83 113
84 void MemoryPressureObserverChromeOS::StopObserving() { 114 void MemoryPressureObserverChromeOS::StopObserving() {
85 // If StartObserving failed, StopObserving will still get called. 115 // If StartObserving failed, StopObserving will still get called.
86 timer_.Stop(); 116 timer_.Stop();
87 } 117 }
88 118
89 void MemoryPressureObserverChromeOS::CheckMemoryPressure() { 119 void MemoryPressureObserverChromeOS::CheckMemoryPressure() {
90 MemoryPressureListener::MemoryPressureLevel old_pressure = 120 MemoryPressureListener::MemoryPressureLevel old_pressure =
91 current_memory_pressure_level_; 121 current_memory_pressure_level_;
92 MemoryPressureListener::MemoryPressureLevel new_pressure = 122 current_memory_pressure_level_ =
93 GetMemoryPressureLevelFromFillLevel(GetUsedMemoryInPercent()); 123 GetMemoryPressureLevelFromFillLevel(used_memory_in_percent_());
94 if (old_pressure != new_pressure) { 124 // In cas there is no memory pressure we do not notify.
James Cook 2014/12/20 00:27:46 cas -> case
Mr4D (OOO till 08-26) 2014/12/20 03:01:04 Done.
95 current_memory_pressure_level_ = new_pressure; 125 if (current_memory_pressure_level_ ==
96 // Everything but NONE will be sent to the listener. 126 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) {
97 if (new_pressure != MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) 127 return;
98 MemoryPressureListener::NotifyMemoryPressure(new_pressure);
99 } 128 }
129 if (old_pressure == current_memory_pressure_level_) {
130 // If the memory pressure is still at the same level, we notify again for a
131 // critical level. In case of a moderate level repeat however, we only send
132 // a notification after a certain time has passed.
133 if (current_memory_pressure_level_ ==
134 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE &&
135 ++moderate_pressure_repeat_count_ <
136 kModerateMemoryPressureCooldown) {
137 return;
138 }
139 } else if (current_memory_pressure_level_ ==
140 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE &&
141 old_pressure ==
142 MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
143 // When we reducing the pressure level from critical to moderate, we
144 // restart the timeout and do not send another notification.
145 moderate_pressure_repeat_count_ = 0;
146 return;
147 }
148 moderate_pressure_repeat_count_ = 0;
149 MemoryPressureListener::NotifyMemoryPressure(current_memory_pressure_level_);
100 } 150 }
101 151
102 } // namespace base 152 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698