Chromium Code Reviews| 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_); |