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

Side by Side Diff: trunk/src/base/memory/discardable_memory_provider.cc

Issue 135113003: Revert 244229 "base: Fix registering of memory pressure listener..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/discardable_memory_provider.h" 5 #include "base/memory/discardable_memory_provider.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/containers/hash_tables.h" 8 #include "base/containers/hash_tables.h"
9 #include "base/containers/mru_cache.h" 9 #include "base/containers/mru_cache.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 11 matching lines...) Expand all
22 static const size_t kDefaultBytesToReclaimUnderModeratePressure = 22 static const size_t kDefaultBytesToReclaimUnderModeratePressure =
23 kDefaultDiscardableMemoryLimit / 2; 23 kDefaultDiscardableMemoryLimit / 2;
24 24
25 } // namespace 25 } // namespace
26 26
27 DiscardableMemoryProvider::DiscardableMemoryProvider() 27 DiscardableMemoryProvider::DiscardableMemoryProvider()
28 : allocations_(AllocationMap::NO_AUTO_EVICT), 28 : allocations_(AllocationMap::NO_AUTO_EVICT),
29 bytes_allocated_(0), 29 bytes_allocated_(0),
30 discardable_memory_limit_(kDefaultDiscardableMemoryLimit), 30 discardable_memory_limit_(kDefaultDiscardableMemoryLimit),
31 bytes_to_reclaim_under_moderate_pressure_( 31 bytes_to_reclaim_under_moderate_pressure_(
32 kDefaultBytesToReclaimUnderModeratePressure) { 32 kDefaultBytesToReclaimUnderModeratePressure),
33 memory_pressure_listener_(
34 base::Bind(&DiscardableMemoryProvider::NotifyMemoryPressure,
35 Unretained(this))) {
33 } 36 }
34 37
35 DiscardableMemoryProvider::~DiscardableMemoryProvider() { 38 DiscardableMemoryProvider::~DiscardableMemoryProvider() {
36 DCHECK(allocations_.empty()); 39 DCHECK(allocations_.empty());
37 DCHECK_EQ(0u, bytes_allocated_); 40 DCHECK_EQ(0u, bytes_allocated_);
38 } 41 }
39 42
40 void DiscardableMemoryProvider::RegisterMemoryPressureListener() { 43 void DiscardableMemoryProvider::NotifyMemoryPressure(
41 AutoLock lock(lock_); 44 MemoryPressureListener::MemoryPressureLevel pressure_level) {
42 DCHECK(base::MessageLoop::current()); 45 switch (pressure_level) {
43 DCHECK(!memory_pressure_listener_); 46 case MemoryPressureListener::MEMORY_PRESSURE_MODERATE:
44 memory_pressure_listener_.reset( 47 Purge();
45 new MemoryPressureListener( 48 return;
46 base::Bind(&DiscardableMemoryProvider::OnMemoryPressure, 49 case MemoryPressureListener::MEMORY_PRESSURE_CRITICAL:
47 Unretained(this)))); 50 PurgeAll();
48 } 51 return;
52 }
49 53
50 void DiscardableMemoryProvider::UnregisterMemoryPressureListener() { 54 NOTREACHED();
51 AutoLock lock(lock_);
52 DCHECK(memory_pressure_listener_);
53 memory_pressure_listener_.reset();
54 } 55 }
55 56
56 void DiscardableMemoryProvider::SetDiscardableMemoryLimit(size_t bytes) { 57 void DiscardableMemoryProvider::SetDiscardableMemoryLimit(size_t bytes) {
57 AutoLock lock(lock_); 58 AutoLock lock(lock_);
58 discardable_memory_limit_ = bytes; 59 discardable_memory_limit_ = bytes;
59 EnforcePolicyWithLockAcquired(); 60 EnforcePolicyWithLockAcquired();
60 } 61 }
61 62
62 void DiscardableMemoryProvider::SetBytesToReclaimUnderModeratePressure( 63 void DiscardableMemoryProvider::SetBytesToReclaimUnderModeratePressure(
63 size_t bytes) { 64 size_t bytes) {
64 AutoLock lock(lock_); 65 AutoLock lock(lock_);
65 bytes_to_reclaim_under_moderate_pressure_ = bytes; 66 bytes_to_reclaim_under_moderate_pressure_ = bytes;
66 } 67 }
67 68
68 void DiscardableMemoryProvider::Register( 69 void DiscardableMemoryProvider::Register(
69 const DiscardableMemory* discardable, size_t bytes) { 70 const DiscardableMemory* discardable, size_t bytes) {
70 AutoLock lock(lock_); 71 AutoLock lock(lock_);
71 // A registered memory listener is currently required. This DCHECK can be
72 // moved or removed if we decide that it's useful to relax this condition.
73 DCHECK(memory_pressure_listener_);
74 DCHECK(allocations_.Peek(discardable) == allocations_.end()); 72 DCHECK(allocations_.Peek(discardable) == allocations_.end());
75 allocations_.Put(discardable, Allocation(bytes)); 73 allocations_.Put(discardable, Allocation(bytes));
76 } 74 }
77 75
78 void DiscardableMemoryProvider::Unregister( 76 void DiscardableMemoryProvider::Unregister(
79 const DiscardableMemory* discardable) { 77 const DiscardableMemory* discardable) {
80 AutoLock lock(lock_); 78 AutoLock lock(lock_);
81 AllocationMap::iterator it = allocations_.Peek(discardable); 79 AllocationMap::iterator it = allocations_.Peek(discardable);
82 if (it == allocations_.end()) 80 if (it == allocations_.end())
83 return; 81 return;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 AutoLock lock(lock_); 162 AutoLock lock(lock_);
165 AllocationMap::const_iterator it = allocations_.Peek(discardable); 163 AllocationMap::const_iterator it = allocations_.Peek(discardable);
166 return it != allocations_.end() && it->second.memory; 164 return it != allocations_.end() && it->second.memory;
167 } 165 }
168 166
169 size_t DiscardableMemoryProvider::GetBytesAllocatedForTest() const { 167 size_t DiscardableMemoryProvider::GetBytesAllocatedForTest() const {
170 AutoLock lock(lock_); 168 AutoLock lock(lock_);
171 return bytes_allocated_; 169 return bytes_allocated_;
172 } 170 }
173 171
174 void DiscardableMemoryProvider::OnMemoryPressure(
175 MemoryPressureListener::MemoryPressureLevel pressure_level) {
176 switch (pressure_level) {
177 case MemoryPressureListener::MEMORY_PRESSURE_MODERATE:
178 Purge();
179 return;
180 case MemoryPressureListener::MEMORY_PRESSURE_CRITICAL:
181 PurgeAll();
182 return;
183 }
184
185 NOTREACHED();
186 }
187
188 void DiscardableMemoryProvider::Purge() { 172 void DiscardableMemoryProvider::Purge() {
189 AutoLock lock(lock_); 173 AutoLock lock(lock_);
190 174
191 if (bytes_to_reclaim_under_moderate_pressure_ == 0) 175 if (bytes_to_reclaim_under_moderate_pressure_ == 0)
192 return; 176 return;
193 177
194 size_t limit = 0; 178 size_t limit = 0;
195 if (bytes_to_reclaim_under_moderate_pressure_ < bytes_allocated_) 179 if (bytes_to_reclaim_under_moderate_pressure_ < bytes_allocated_)
196 limit = bytes_allocated_ - bytes_to_reclaim_under_moderate_pressure_; 180 limit = bytes_allocated_ - bytes_to_reclaim_under_moderate_pressure_;
197 181
(...skipping 24 matching lines...) Expand all
222 it->second.memory = NULL; 206 it->second.memory = NULL;
223 } 207 }
224 } 208 }
225 209
226 void DiscardableMemoryProvider::EnforcePolicyWithLockAcquired() { 210 void DiscardableMemoryProvider::EnforcePolicyWithLockAcquired() {
227 PurgeLRUWithLockAcquiredUntilUsageIsWithin(discardable_memory_limit_); 211 PurgeLRUWithLockAcquiredUntilUsageIsWithin(discardable_memory_limit_);
228 } 212 }
229 213
230 } // namespace internal 214 } // namespace internal
231 } // namespace base 215 } // namespace base
OLDNEW
« no previous file with comments | « trunk/src/base/memory/discardable_memory_provider.h ('k') | trunk/src/base/memory/discardable_memory_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698