| Index: base/memory/discardable_memory_manager.cc
|
| diff --git a/base/memory/discardable_memory_manager.cc b/base/memory/discardable_memory_manager.cc
|
| index 3647b7b2f91a682d2805c2752a981ad771f99e40..d976da203c4a88494dfffa6e73dd167bee6c2c11 100644
|
| --- a/base/memory/discardable_memory_manager.cc
|
| +++ b/base/memory/discardable_memory_manager.cc
|
| @@ -18,11 +18,14 @@
|
| DiscardableMemoryManager::DiscardableMemoryManager(
|
| size_t memory_limit,
|
| size_t soft_memory_limit,
|
| + size_t bytes_to_keep_under_moderate_pressure,
|
| TimeDelta hard_memory_limit_expiration_time)
|
| : allocations_(AllocationMap::NO_AUTO_EVICT),
|
| bytes_allocated_(0u),
|
| memory_limit_(memory_limit),
|
| soft_memory_limit_(soft_memory_limit),
|
| + bytes_to_keep_under_moderate_pressure_(
|
| + bytes_to_keep_under_moderate_pressure),
|
| hard_memory_limit_expiration_time_(hard_memory_limit_expiration_time) {
|
| BytesAllocatedChanged(bytes_allocated_);
|
| }
|
| @@ -32,6 +35,20 @@
|
| DCHECK_EQ(0u, bytes_allocated_);
|
| }
|
|
|
| +void DiscardableMemoryManager::RegisterMemoryPressureListener() {
|
| + AutoLock lock(lock_);
|
| + DCHECK(base::MessageLoop::current());
|
| + DCHECK(!memory_pressure_listener_);
|
| + memory_pressure_listener_.reset(new MemoryPressureListener(base::Bind(
|
| + &DiscardableMemoryManager::OnMemoryPressure, Unretained(this))));
|
| +}
|
| +
|
| +void DiscardableMemoryManager::UnregisterMemoryPressureListener() {
|
| + AutoLock lock(lock_);
|
| + DCHECK(memory_pressure_listener_);
|
| + memory_pressure_listener_.reset();
|
| +}
|
| +
|
| void DiscardableMemoryManager::SetMemoryLimit(size_t bytes) {
|
| AutoLock lock(lock_);
|
| memory_limit_ = bytes;
|
| @@ -42,6 +59,12 @@
|
| void DiscardableMemoryManager::SetSoftMemoryLimit(size_t bytes) {
|
| AutoLock lock(lock_);
|
| soft_memory_limit_ = bytes;
|
| +}
|
| +
|
| +void DiscardableMemoryManager::SetBytesToKeepUnderModeratePressure(
|
| + size_t bytes) {
|
| + AutoLock lock(lock_);
|
| + bytes_to_keep_under_moderate_pressure_ = bytes;
|
| }
|
|
|
| void DiscardableMemoryManager::SetHardMemoryLimitExpirationTime(
|
| @@ -54,14 +77,13 @@
|
| return PurgeIfNotUsedSinceHardLimitCutoffUntilWithinSoftMemoryLimit();
|
| }
|
|
|
| -void DiscardableMemoryManager::ReduceMemoryUsageUntilWithinLimit(size_t bytes) {
|
| - AutoLock lock(lock_);
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(Now(),
|
| - bytes);
|
| -}
|
| -
|
| void DiscardableMemoryManager::Register(Allocation* allocation, 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_);
|
| DCHECK(allocations_.Peek(allocation) == allocations_.end());
|
| allocations_.Put(allocation, AllocationInfo(bytes));
|
| }
|
| @@ -160,6 +182,28 @@
|
| return bytes_allocated_;
|
| }
|
|
|
| +void DiscardableMemoryManager::OnMemoryPressure(
|
| + MemoryPressureListener::MemoryPressureLevel pressure_level) {
|
| + switch (pressure_level) {
|
| + case MemoryPressureListener::MEMORY_PRESSURE_MODERATE:
|
| + PurgeUntilWithinBytesToKeepUnderModeratePressure();
|
| + return;
|
| + case MemoryPressureListener::MEMORY_PRESSURE_CRITICAL:
|
| + PurgeAll();
|
| + return;
|
| + }
|
| +
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void
|
| +DiscardableMemoryManager::PurgeUntilWithinBytesToKeepUnderModeratePressure() {
|
| + AutoLock lock(lock_);
|
| +
|
| + PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
|
| + Now(), bytes_to_keep_under_moderate_pressure_);
|
| +}
|
| +
|
| bool DiscardableMemoryManager::
|
| PurgeIfNotUsedSinceHardLimitCutoffUntilWithinSoftMemoryLimit() {
|
| AutoLock lock(lock_);
|
|
|