Index: base/memory/discardable_memory_provider.cc |
diff --git a/base/memory/discardable_memory_provider.cc b/base/memory/discardable_memory_provider.cc |
index 1c84339eba7aea5877446f893a94a019c2605def..eeffa5b25ad1c7392791f0f639feeeea53f7b365 100644 |
--- a/base/memory/discardable_memory_provider.cc |
+++ b/base/memory/discardable_memory_provider.cc |
@@ -29,10 +29,7 @@ DiscardableMemoryProvider::DiscardableMemoryProvider() |
bytes_allocated_(0), |
discardable_memory_limit_(kDefaultDiscardableMemoryLimit), |
bytes_to_reclaim_under_moderate_pressure_( |
- kDefaultBytesToReclaimUnderModeratePressure), |
- memory_pressure_listener_( |
- base::Bind(&DiscardableMemoryProvider::NotifyMemoryPressure, |
- Unretained(this))) { |
+ kDefaultBytesToReclaimUnderModeratePressure) { |
} |
DiscardableMemoryProvider::~DiscardableMemoryProvider() { |
@@ -40,18 +37,20 @@ DiscardableMemoryProvider::~DiscardableMemoryProvider() { |
DCHECK_EQ(0u, bytes_allocated_); |
} |
-void DiscardableMemoryProvider::NotifyMemoryPressure( |
- MemoryPressureListener::MemoryPressureLevel pressure_level) { |
- switch (pressure_level) { |
- case MemoryPressureListener::MEMORY_PRESSURE_MODERATE: |
- Purge(); |
- return; |
- case MemoryPressureListener::MEMORY_PRESSURE_CRITICAL: |
- PurgeAll(); |
- return; |
- } |
+void DiscardableMemoryProvider::RegisterMemoryPressureListener() { |
+ AutoLock lock(lock_); |
+ DCHECK(base::MessageLoop::current()); |
+ DCHECK(!memory_pressure_listener_); |
+ memory_pressure_listener_.reset( |
+ new MemoryPressureListener( |
+ base::Bind(&DiscardableMemoryProvider::OnMemoryPressure, |
+ Unretained(this)))); |
+} |
- NOTREACHED(); |
+void DiscardableMemoryProvider::UnregisterMemoryPressureListener() { |
+ AutoLock lock(lock_); |
+ DCHECK(memory_pressure_listener_); |
+ memory_pressure_listener_.reset(); |
} |
void DiscardableMemoryProvider::SetDiscardableMemoryLimit(size_t bytes) { |
@@ -69,6 +68,11 @@ void DiscardableMemoryProvider::SetBytesToReclaimUnderModeratePressure( |
void DiscardableMemoryProvider::Register( |
const DiscardableMemory* discardable, size_t bytes) { |
AutoLock lock(lock_); |
+ // A registered memory listener is currently required. This DCHECK can be |
+ // moved or removed if we decide that it's useful to relax this condition. |
+ // TODO(reveman): Enable this DCHECK when skia and blink are able to |
+ // register memory pressure listeners. crbug.com/333907 |
+ // DCHECK(memory_pressure_listener_); |
reveman
2014/01/13 18:22:28
Disabled this DCHECK for now as it's causing webki
|
DCHECK(allocations_.Peek(discardable) == allocations_.end()); |
allocations_.Put(discardable, Allocation(bytes)); |
} |
@@ -169,6 +173,20 @@ size_t DiscardableMemoryProvider::GetBytesAllocatedForTest() const { |
return bytes_allocated_; |
} |
+void DiscardableMemoryProvider::OnMemoryPressure( |
+ MemoryPressureListener::MemoryPressureLevel pressure_level) { |
+ switch (pressure_level) { |
+ case MemoryPressureListener::MEMORY_PRESSURE_MODERATE: |
+ Purge(); |
+ return; |
+ case MemoryPressureListener::MEMORY_PRESSURE_CRITICAL: |
+ PurgeAll(); |
+ return; |
+ } |
+ |
+ NOTREACHED(); |
+} |
+ |
void DiscardableMemoryProvider::Purge() { |
AutoLock lock(lock_); |