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_); |