| Index: content/common/discardable_shared_memory_heap.cc
|
| diff --git a/content/common/discardable_shared_memory_heap.cc b/content/common/discardable_shared_memory_heap.cc
|
| index 36ee632255329506570831c90bc23287cad00580..c784f13491519c69d8877a344053bbc12c7a15de 100644
|
| --- a/content/common/discardable_shared_memory_heap.cc
|
| +++ b/content/common/discardable_shared_memory_heap.cc
|
| @@ -7,10 +7,14 @@
|
| #include <algorithm>
|
|
|
| #include "base/memory/discardable_shared_memory.h"
|
| +#include "base/strings/stringprintf.h"
|
|
|
| namespace content {
|
| namespace {
|
|
|
| +const char kMemoryAllocatorHeapNamePrefix[] = "segment";
|
| +const char kMemoryAllocatorName[] = "discardable";
|
| +
|
| bool IsPowerOfTwo(size_t x) {
|
| return (x & (x - 1)) == 0;
|
| }
|
| @@ -35,10 +39,12 @@ DiscardableSharedMemoryHeap::ScopedMemorySegment::ScopedMemorySegment(
|
| DiscardableSharedMemoryHeap* heap,
|
| scoped_ptr<base::DiscardableSharedMemory> shared_memory,
|
| size_t size,
|
| + int32_t id,
|
| const base::Closure& deleted_callback)
|
| : heap_(heap),
|
| shared_memory_(shared_memory.Pass()),
|
| size_(size),
|
| + id_(id),
|
| deleted_callback_(deleted_callback) {
|
| }
|
|
|
| @@ -55,6 +61,11 @@ bool DiscardableSharedMemoryHeap::ScopedMemorySegment::IsResident() const {
|
| return heap_->IsMemoryResident(shared_memory_.get());
|
| }
|
|
|
| +void DiscardableSharedMemoryHeap::ScopedMemorySegment::OnMemoryDump(
|
| + base::trace_event::ProcessMemoryDump* pmd) const {
|
| + heap_->OnMemoryDump(shared_memory_.get(), size_, id_, pmd);
|
| +}
|
| +
|
| DiscardableSharedMemoryHeap::DiscardableSharedMemoryHeap(size_t block_size)
|
| : block_size_(block_size), num_blocks_(0), num_free_blocks_(0) {
|
| DCHECK_NE(block_size_, 0u);
|
| @@ -75,6 +86,7 @@ DiscardableSharedMemoryHeap::~DiscardableSharedMemoryHeap() {
|
| scoped_ptr<DiscardableSharedMemoryHeap::Span> DiscardableSharedMemoryHeap::Grow(
|
| scoped_ptr<base::DiscardableSharedMemory> shared_memory,
|
| size_t size,
|
| + int32_t id,
|
| const base::Closure& deleted_callback) {
|
| // Memory must be aligned to block size.
|
| DCHECK_EQ(
|
| @@ -93,8 +105,8 @@ scoped_ptr<DiscardableSharedMemoryHeap::Span> DiscardableSharedMemoryHeap::Grow(
|
| num_blocks_ += span->length_;
|
|
|
| // Start tracking if segment is resident by adding it to |memory_segments_|.
|
| - memory_segments_.push_back(new ScopedMemorySegment(this, shared_memory.Pass(),
|
| - size, deleted_callback));
|
| + memory_segments_.push_back(new ScopedMemorySegment(
|
| + this, shared_memory.Pass(), size, id, deleted_callback));
|
|
|
| return span.Pass();
|
| }
|
| @@ -212,6 +224,16 @@ size_t DiscardableSharedMemoryHeap::GetSizeOfFreeLists() const {
|
| return num_free_blocks_ * block_size_;
|
| }
|
|
|
| +bool DiscardableSharedMemoryHeap::OnMemoryDump(
|
| + base::trace_event::ProcessMemoryDump* pmd) {
|
| + std::for_each(
|
| + memory_segments_.begin(), memory_segments_.end(),
|
| + [pmd](const ScopedMemorySegment* segment) {
|
| + segment->OnMemoryDump(pmd);
|
| + });
|
| + return true;
|
| +}
|
| +
|
| void DiscardableSharedMemoryHeap::InsertIntoFreeList(
|
| scoped_ptr<DiscardableSharedMemoryHeap::Span> span) {
|
| DCHECK(!IsInFreeList(span.get()));
|
| @@ -316,4 +338,40 @@ void DiscardableSharedMemoryHeap::ReleaseMemory(
|
| }
|
| }
|
|
|
| +void DiscardableSharedMemoryHeap::OnMemoryDump(
|
| + const base::DiscardableSharedMemory* shared_memory,
|
| + size_t size,
|
| + int32_t id,
|
| + base::trace_event::ProcessMemoryDump* pmd) {
|
| + std::string heap_name = base::StringPrintf(
|
| + "%s/%s_%d", kMemoryAllocatorName, kMemoryAllocatorHeapNamePrefix, id);
|
| + base::trace_event::MemoryAllocatorDump* dump =
|
| + pmd->CreateAllocatorDump(heap_name);
|
| + DCHECK(dump);
|
| +
|
| + size_t allocated_objects_count = 0;
|
| + size_t allocated_objects_size_in_bytes = 0;
|
| + size_t offset =
|
| + reinterpret_cast<size_t>(shared_memory->memory()) / block_size_;
|
| + size_t end = offset + size / block_size_;
|
| + while (offset < end) {
|
| + Span* span = spans_[offset];
|
| + if (!IsInFreeList(span)) {
|
| + allocated_objects_count++;
|
| + allocated_objects_size_in_bytes += span->length_;
|
| + }
|
| + offset += span->length_;
|
| + }
|
| +
|
| + dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameOuterSize,
|
| + base::trace_event::MemoryAllocatorDump::kUnitsBytes,
|
| + static_cast<uint64_t>(size));
|
| + dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameObjectsCount,
|
| + base::trace_event::MemoryAllocatorDump::kUnitsObjects,
|
| + static_cast<uint64_t>(allocated_objects_count));
|
| + dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameInnerSize,
|
| + base::trace_event::MemoryAllocatorDump::kUnitsBytes,
|
| + static_cast<uint64_t>(allocated_objects_size_in_bytes));
|
| +}
|
| +
|
| } // namespace content
|
|
|