| Index: blimp/client/app/blimp_discardable_memory_allocator.cc
|
| diff --git a/blimp/client/app/blimp_discardable_memory_allocator.cc b/blimp/client/app/blimp_discardable_memory_allocator.cc
|
| deleted file mode 100644
|
| index 08f315147905aeb4b33ad15807c6988d859f0e46..0000000000000000000000000000000000000000
|
| --- a/blimp/client/app/blimp_discardable_memory_allocator.cc
|
| +++ /dev/null
|
| @@ -1,186 +0,0 @@
|
| -// Copyright 2016 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 "blimp/client/app/blimp_discardable_memory_allocator.h"
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/memory/discardable_memory.h"
|
| -#include "base/trace_event/memory_allocator_dump.h"
|
| -#include "base/trace_event/memory_dump_manager.h"
|
| -#include "base/trace_event/process_memory_dump.h"
|
| -
|
| -namespace blimp {
|
| -namespace client {
|
| -
|
| -namespace {
|
| -
|
| -size_t kDesiredMaxMemory = 20 * 1024 * 1024; /* 20 MB */
|
| -
|
| -} // namespace
|
| -
|
| -// Interface to the rest of the program. These objects are owned outside of the
|
| -// allocator.
|
| -class BlimpDiscardableMemoryAllocator::DiscardableMemoryChunkImpl
|
| - : public base::DiscardableMemory {
|
| - public:
|
| - DiscardableMemoryChunkImpl(size_t size,
|
| - BlimpDiscardableMemoryAllocator* allocator)
|
| - : is_locked_(true),
|
| - size_(size),
|
| - data_(new uint8_t[size]),
|
| - allocator_(allocator) {}
|
| -
|
| - ~DiscardableMemoryChunkImpl() override {
|
| - DCHECK(allocator_); // Required for EXPECT_DCHECK_DEATH().
|
| - base::AutoLock lock(allocator_->lock_);
|
| - // Either the memory is discarded or the memory chunk is unlocked.
|
| - DCHECK(data_ || !is_locked_);
|
| - if (!is_locked_ && data_)
|
| - allocator_->NotifyDestructed(unlocked_position_);
|
| - }
|
| -
|
| - // Overridden from DiscardableMemoryChunk:
|
| - bool Lock() override {
|
| - base::AutoLock lock(allocator_->lock_);
|
| - DCHECK(!is_locked_);
|
| - if (!data_)
|
| - return false;
|
| -
|
| - is_locked_ = true;
|
| - allocator_->NotifyLocked(unlocked_position_);
|
| - return true;
|
| - }
|
| -
|
| - void Unlock() override {
|
| - base::AutoLock lock(allocator_->lock_);
|
| - DCHECK(is_locked_);
|
| - DCHECK(data_);
|
| - is_locked_ = false;
|
| - unlocked_position_ = allocator_->NotifyUnlocked(this);
|
| -
|
| - // Allow the allocator to discard our memory if required.
|
| - allocator_->FreeUnlockedChunksIfNeeded();
|
| - }
|
| -
|
| - void* data() const override {
|
| - if (data_) {
|
| - DCHECK(is_locked_);
|
| - return data_.get();
|
| - }
|
| - return nullptr;
|
| - }
|
| -
|
| - base::trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump(
|
| - const char* name,
|
| - base::trace_event::ProcessMemoryDump* pmd) const override {
|
| - base::trace_event::MemoryAllocatorDump* dump =
|
| - pmd->CreateAllocatorDump(name);
|
| - dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
|
| - base::trace_event::MemoryAllocatorDump::kUnitsBytes, size_);
|
| -
|
| - // Memory is allocated from system allocator (malloc).
|
| - pmd->AddSuballocation(dump->guid(),
|
| - base::trace_event::MemoryDumpManager::GetInstance()
|
| - ->system_allocator_pool_name());
|
| - return dump;
|
| - }
|
| -
|
| - size_t size() const { return size_; }
|
| -
|
| - void Discard() {
|
| - allocator_->lock_.AssertAcquired();
|
| - DCHECK(!is_locked_);
|
| - data_.reset();
|
| - }
|
| -
|
| -#if DCHECK_IS_ON()
|
| - void DetachForDebug() {
|
| - allocator_->lock_.AssertAcquired();
|
| - allocator_ = nullptr;
|
| - }
|
| -#endif // DCHECK_IS_ON()
|
| -
|
| - private:
|
| - bool is_locked_;
|
| - size_t size_;
|
| - std::unique_ptr<uint8_t[]> data_;
|
| - BlimpDiscardableMemoryAllocator* allocator_;
|
| -
|
| - MemoryChunkList::iterator unlocked_position_;
|
| -
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(DiscardableMemoryChunkImpl);
|
| -};
|
| -
|
| -BlimpDiscardableMemoryAllocator::BlimpDiscardableMemoryAllocator()
|
| - : BlimpDiscardableMemoryAllocator(kDesiredMaxMemory) {}
|
| -
|
| -BlimpDiscardableMemoryAllocator::BlimpDiscardableMemoryAllocator(
|
| - size_t desired_max_memory)
|
| - : desired_max_memory_(desired_max_memory),
|
| - total_live_memory_(0u),
|
| - locked_chunks_(0) {
|
| -}
|
| -
|
| -BlimpDiscardableMemoryAllocator::~BlimpDiscardableMemoryAllocator() {
|
| - DCHECK_EQ(0, locked_chunks_);
|
| -// DCHECK_EQ(0u, live_unlocked_chunks_.size());
|
| -#if DCHECK_IS_ON()
|
| - base::AutoLock lock(lock_);
|
| - for (auto unlocked_chunk : live_unlocked_chunks_) {
|
| - unlocked_chunk->DetachForDebug();
|
| - }
|
| -#endif // DCHECK_IS_ON()
|
| -}
|
| -
|
| -std::unique_ptr<base::DiscardableMemory>
|
| -BlimpDiscardableMemoryAllocator::AllocateLockedDiscardableMemory(size_t size) {
|
| - base::AutoLock lock(lock_);
|
| - std::unique_ptr<DiscardableMemoryChunkImpl> chunk(
|
| - new DiscardableMemoryChunkImpl(size, this));
|
| - total_live_memory_ += size;
|
| - locked_chunks_++;
|
| -
|
| - FreeUnlockedChunksIfNeeded();
|
| -
|
| - return std::move(chunk);
|
| -}
|
| -
|
| -BlimpDiscardableMemoryAllocator::MemoryChunkList::iterator
|
| -BlimpDiscardableMemoryAllocator::NotifyUnlocked(
|
| - DiscardableMemoryChunkImpl* chunk) {
|
| - lock_.AssertAcquired();
|
| - locked_chunks_--;
|
| - return live_unlocked_chunks_.insert(live_unlocked_chunks_.end(), chunk);
|
| -}
|
| -
|
| -void BlimpDiscardableMemoryAllocator::NotifyLocked(
|
| -MemoryChunkList::iterator it) {
|
| - lock_.AssertAcquired();
|
| - locked_chunks_++;
|
| - live_unlocked_chunks_.erase(it);
|
| -}
|
| -
|
| -void BlimpDiscardableMemoryAllocator::NotifyDestructed(
|
| - MemoryChunkList::iterator it) {
|
| - lock_.AssertAcquired();
|
| - live_unlocked_chunks_.erase(it);
|
| -}
|
| -
|
| -void BlimpDiscardableMemoryAllocator::FreeUnlockedChunksIfNeeded() {
|
| - lock_.AssertAcquired();
|
| -
|
| - // Go through the list of unlocked live chunks starting from the least
|
| - // recently used, freeing as many as we can until we get our size under the
|
| - // desired maximum.
|
| - auto it = live_unlocked_chunks_.begin();
|
| - while (total_live_memory_ > desired_max_memory_ &&
|
| - it != live_unlocked_chunks_.end()) {
|
| - total_live_memory_ -= (*it)->size();
|
| - (*it)->Discard();
|
| - it = live_unlocked_chunks_.erase(it);
|
| - }
|
| -}
|
| -
|
| -} // namespace client
|
| -} // namespace blimp
|
|
|