| Index: base/memory/discardable_memory_manager.cc
|
| diff --git a/base/memory/discardable_memory_manager.cc b/base/memory/discardable_memory_manager.cc
|
| deleted file mode 100644
|
| index cbbdb4770af04494f48290fb7bfae500e5496b47..0000000000000000000000000000000000000000
|
| --- a/base/memory/discardable_memory_manager.cc
|
| +++ /dev/null
|
| @@ -1,218 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/memory/discardable_memory_manager.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/containers/adapters.h"
|
| -#include "base/containers/hash_tables.h"
|
| -#include "base/containers/mru_cache.h"
|
| -#include "base/debug/crash_logging.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "base/trace_event/trace_event.h"
|
| -
|
| -namespace base {
|
| -namespace internal {
|
| -
|
| -DiscardableMemoryManager::DiscardableMemoryManager(
|
| - size_t memory_limit,
|
| - size_t soft_memory_limit,
|
| - TimeDelta hard_memory_limit_expiration_time)
|
| - : allocations_(AllocationMap::NO_AUTO_EVICT),
|
| - bytes_allocated_(0u),
|
| - memory_limit_(memory_limit),
|
| - soft_memory_limit_(soft_memory_limit),
|
| - hard_memory_limit_expiration_time_(hard_memory_limit_expiration_time) {
|
| - BytesAllocatedChanged(bytes_allocated_);
|
| -}
|
| -
|
| -DiscardableMemoryManager::~DiscardableMemoryManager() {
|
| - DCHECK(allocations_.empty());
|
| - DCHECK_EQ(0u, bytes_allocated_);
|
| -}
|
| -
|
| -void DiscardableMemoryManager::SetMemoryLimit(size_t bytes) {
|
| - AutoLock lock(lock_);
|
| - memory_limit_ = bytes;
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
|
| - Now(), memory_limit_);
|
| -}
|
| -
|
| -void DiscardableMemoryManager::SetSoftMemoryLimit(size_t bytes) {
|
| - AutoLock lock(lock_);
|
| - soft_memory_limit_ = bytes;
|
| -}
|
| -
|
| -void DiscardableMemoryManager::SetHardMemoryLimitExpirationTime(
|
| - TimeDelta hard_memory_limit_expiration_time) {
|
| - AutoLock lock(lock_);
|
| - hard_memory_limit_expiration_time_ = hard_memory_limit_expiration_time;
|
| -}
|
| -
|
| -bool DiscardableMemoryManager::ReduceMemoryUsage() {
|
| - 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_);
|
| - DCHECK(allocations_.Peek(allocation) == allocations_.end());
|
| - allocations_.Put(allocation, AllocationInfo(bytes));
|
| -}
|
| -
|
| -void DiscardableMemoryManager::Unregister(Allocation* allocation) {
|
| - AutoLock lock(lock_);
|
| - AllocationMap::iterator it = allocations_.Peek(allocation);
|
| - DCHECK(it != allocations_.end());
|
| - const AllocationInfo& info = it->second;
|
| -
|
| - if (info.purgable) {
|
| - size_t bytes_purgable = info.bytes;
|
| - DCHECK_LE(bytes_purgable, bytes_allocated_);
|
| - bytes_allocated_ -= bytes_purgable;
|
| - BytesAllocatedChanged(bytes_allocated_);
|
| - }
|
| - allocations_.Erase(it);
|
| -}
|
| -
|
| -bool DiscardableMemoryManager::AcquireLock(Allocation* allocation,
|
| - bool* purged) {
|
| - AutoLock lock(lock_);
|
| - // Note: |allocations_| is an MRU cache, and use of |Get| here updates that
|
| - // cache.
|
| - AllocationMap::iterator it = allocations_.Get(allocation);
|
| - DCHECK(it != allocations_.end());
|
| - AllocationInfo* info = &it->second;
|
| -
|
| - if (!info->bytes)
|
| - return false;
|
| -
|
| - TimeTicks now = Now();
|
| - size_t bytes_required = info->purgable ? 0u : info->bytes;
|
| -
|
| - if (memory_limit_) {
|
| - size_t limit = 0;
|
| - if (bytes_required < memory_limit_)
|
| - limit = memory_limit_ - bytes_required;
|
| -
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(now,
|
| - limit);
|
| - }
|
| -
|
| - // Check for overflow.
|
| - if (std::numeric_limits<size_t>::max() - bytes_required < bytes_allocated_)
|
| - return false;
|
| -
|
| - *purged = !allocation->AllocateAndAcquireLock();
|
| - info->purgable = false;
|
| - info->last_usage = now;
|
| - if (bytes_required) {
|
| - bytes_allocated_ += bytes_required;
|
| - BytesAllocatedChanged(bytes_allocated_);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void DiscardableMemoryManager::ReleaseLock(Allocation* allocation) {
|
| - AutoLock lock(lock_);
|
| - // Note: |allocations_| is an MRU cache, and use of |Get| here updates that
|
| - // cache.
|
| - AllocationMap::iterator it = allocations_.Get(allocation);
|
| - DCHECK(it != allocations_.end());
|
| - AllocationInfo* info = &it->second;
|
| -
|
| - TimeTicks now = Now();
|
| - allocation->ReleaseLock();
|
| - info->purgable = true;
|
| - info->last_usage = now;
|
| -
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
|
| - now, memory_limit_);
|
| -}
|
| -
|
| -void DiscardableMemoryManager::PurgeAll() {
|
| - AutoLock lock(lock_);
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(Now(), 0);
|
| -}
|
| -
|
| -bool DiscardableMemoryManager::IsRegisteredForTest(
|
| - Allocation* allocation) const {
|
| - AutoLock lock(lock_);
|
| - AllocationMap::const_iterator it = allocations_.Peek(allocation);
|
| - return it != allocations_.end();
|
| -}
|
| -
|
| -bool DiscardableMemoryManager::CanBePurgedForTest(
|
| - Allocation* allocation) const {
|
| - AutoLock lock(lock_);
|
| - AllocationMap::const_iterator it = allocations_.Peek(allocation);
|
| - return it != allocations_.end() && it->second.purgable;
|
| -}
|
| -
|
| -size_t DiscardableMemoryManager::GetBytesAllocatedForTest() const {
|
| - AutoLock lock(lock_);
|
| - return bytes_allocated_;
|
| -}
|
| -
|
| -bool DiscardableMemoryManager::
|
| - PurgeIfNotUsedSinceHardLimitCutoffUntilWithinSoftMemoryLimit() {
|
| - AutoLock lock(lock_);
|
| -
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
|
| - Now() - hard_memory_limit_expiration_time_, soft_memory_limit_);
|
| -
|
| - return bytes_allocated_ <= soft_memory_limit_;
|
| -}
|
| -
|
| -void DiscardableMemoryManager::
|
| - PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
|
| - TimeTicks timestamp,
|
| - size_t limit) {
|
| - lock_.AssertAcquired();
|
| -
|
| - size_t bytes_allocated_before_purging = bytes_allocated_;
|
| - for (auto& entry : base::Reversed(allocations_)) {
|
| - Allocation* allocation = entry.first;
|
| - AllocationInfo* info = &entry.second;
|
| -
|
| - if (bytes_allocated_ <= limit)
|
| - break;
|
| -
|
| - bool purgable = info->purgable && info->last_usage <= timestamp;
|
| - if (!purgable)
|
| - continue;
|
| -
|
| - size_t bytes_purgable = info->bytes;
|
| - DCHECK_LE(bytes_purgable, bytes_allocated_);
|
| - bytes_allocated_ -= bytes_purgable;
|
| - info->purgable = false;
|
| - allocation->Purge();
|
| - }
|
| -
|
| - if (bytes_allocated_ != bytes_allocated_before_purging)
|
| - BytesAllocatedChanged(bytes_allocated_);
|
| -}
|
| -
|
| -void DiscardableMemoryManager::BytesAllocatedChanged(
|
| - size_t new_bytes_allocated) const {
|
| - TRACE_COUNTER_ID1(
|
| - "base", "DiscardableMemoryUsage", this, new_bytes_allocated);
|
| -
|
| - static const char kDiscardableMemoryUsageKey[] = "dm-usage";
|
| - base::debug::SetCrashKeyValue(kDiscardableMemoryUsageKey,
|
| - Uint64ToString(new_bytes_allocated));
|
| -}
|
| -
|
| -TimeTicks DiscardableMemoryManager::Now() const {
|
| - return TimeTicks::Now();
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace base
|
|
|