Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: content/common/discardable_shared_memory_heap.cc

Issue 1100073004: Adding discardable memory dump provider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/discardable_shared_memory_heap.h" 5 #include "content/common/discardable_shared_memory_heap.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/memory/discardable_shared_memory.h" 9 #include "base/memory/discardable_shared_memory.h"
10 10
(...skipping 13 matching lines...) Expand all
24 DiscardableSharedMemoryHeap::Span::Span( 24 DiscardableSharedMemoryHeap::Span::Span(
25 base::DiscardableSharedMemory* shared_memory, 25 base::DiscardableSharedMemory* shared_memory,
26 size_t start, 26 size_t start,
27 size_t length) 27 size_t length)
28 : shared_memory_(shared_memory), start_(start), length_(length) { 28 : shared_memory_(shared_memory), start_(start), length_(length) {
29 } 29 }
30 30
31 DiscardableSharedMemoryHeap::Span::~Span() { 31 DiscardableSharedMemoryHeap::Span::~Span() {
32 } 32 }
33 33
34 DiscardableSharedMemoryHeap::MemoryStatistics::MemoryStatistics() {
35 }
36
37 DiscardableSharedMemoryHeap::MemoryStatistics::~MemoryStatistics() {
38 }
39
34 DiscardableSharedMemoryHeap::ScopedMemorySegment::ScopedMemorySegment( 40 DiscardableSharedMemoryHeap::ScopedMemorySegment::ScopedMemorySegment(
35 DiscardableSharedMemoryHeap* heap, 41 DiscardableSharedMemoryHeap* heap,
36 scoped_ptr<base::DiscardableSharedMemory> shared_memory, 42 scoped_ptr<base::DiscardableSharedMemory> shared_memory,
37 size_t size, 43 size_t size,
38 const base::Closure& deleted_callback) 44 const base::Closure& deleted_callback)
39 : heap_(heap), 45 : heap_(heap),
40 shared_memory_(shared_memory.Pass()), 46 shared_memory_(shared_memory.Pass()),
41 size_(size), 47 size_(size),
42 deleted_callback_(deleted_callback) { 48 deleted_callback_(deleted_callback) {
43 } 49 }
44 50
45 DiscardableSharedMemoryHeap::ScopedMemorySegment::~ScopedMemorySegment() { 51 DiscardableSharedMemoryHeap::ScopedMemorySegment::~ScopedMemorySegment() {
46 heap_->ReleaseMemory(shared_memory_.get(), size_); 52 heap_->ReleaseMemory(shared_memory_.get(), size_);
47 deleted_callback_.Run(); 53 deleted_callback_.Run();
48 } 54 }
49 55
50 bool DiscardableSharedMemoryHeap::ScopedMemorySegment::IsUsed() const { 56 bool DiscardableSharedMemoryHeap::ScopedMemorySegment::IsUsed() const {
51 return heap_->IsMemoryUsed(shared_memory_.get(), size_); 57 return heap_->IsMemoryUsed(shared_memory_.get(), size_);
52 } 58 }
53 59
54 bool DiscardableSharedMemoryHeap::ScopedMemorySegment::IsResident() const { 60 bool DiscardableSharedMemoryHeap::ScopedMemorySegment::IsResident() const {
55 return heap_->IsMemoryResident(shared_memory_.get()); 61 return heap_->IsMemoryResident(shared_memory_.get());
56 } 62 }
57 63
64 void DiscardableSharedMemoryHeap::ScopedMemorySegment::GetStatistics(
65 MemoryStatistics::SegmentStatistics* segment_stats) {
reveman 2015/04/23 17:32:30 I prefer if this was kept consistent with Discarda
ssid 2015/04/23 18:03:07 shared_memory is private field here, not shared wi
reveman 2015/04/23 18:11:53 I think Heap class is already a friend.
ssid 2015/04/24 11:23:04 Made it friend now.
66 segment_stats->size = size_;
67 size_t offset =
68 reinterpret_cast<size_t>(shared_memory_->memory()) / heap_->block_size_;
69 segment_stats->num_of_objects = 0;
70 segment_stats->used_size = 0;
71 size_t end = offset + size_ / heap_->block_size_;
72 while (offset < end) {
73 Span* span = heap_->spans_[offset];
74 if (!IsInFreeList(span)) {
75 segment_stats->num_of_objects++;
76 segment_stats->used_size += span->length_;
77 }
78 offset += span->length_;
79 }
80 }
81
58 DiscardableSharedMemoryHeap::DiscardableSharedMemoryHeap(size_t block_size) 82 DiscardableSharedMemoryHeap::DiscardableSharedMemoryHeap(size_t block_size)
59 : block_size_(block_size), num_blocks_(0), num_free_blocks_(0) { 83 : block_size_(block_size), num_blocks_(0), num_free_blocks_(0) {
60 DCHECK_NE(block_size_, 0u); 84 DCHECK_NE(block_size_, 0u);
61 DCHECK(IsPowerOfTwo(block_size_)); 85 DCHECK(IsPowerOfTwo(block_size_));
62 } 86 }
63 87
64 DiscardableSharedMemoryHeap::~DiscardableSharedMemoryHeap() { 88 DiscardableSharedMemoryHeap::~DiscardableSharedMemoryHeap() {
65 memory_segments_.clear(); 89 memory_segments_.clear();
66 DCHECK_EQ(num_blocks_, 0u); 90 DCHECK_EQ(num_blocks_, 0u);
67 DCHECK_EQ(num_free_blocks_, 0u); 91 DCHECK_EQ(num_free_blocks_, 0u);
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 229 }
206 230
207 size_t DiscardableSharedMemoryHeap::GetSize() const { 231 size_t DiscardableSharedMemoryHeap::GetSize() const {
208 return num_blocks_ * block_size_; 232 return num_blocks_ * block_size_;
209 } 233 }
210 234
211 size_t DiscardableSharedMemoryHeap::GetSizeOfFreeLists() const { 235 size_t DiscardableSharedMemoryHeap::GetSizeOfFreeLists() const {
212 return num_free_blocks_ * block_size_; 236 return num_free_blocks_ * block_size_;
213 } 237 }
214 238
239 void DiscardableSharedMemoryHeap::GetMemoryStatistics(
240 DiscardableSharedMemoryHeap::MemoryStatistics* statistics) {
241 statistics->block_size = block_size_;
242 statistics->total_size = GetSize();
243 statistics->total_used_size = statistics->total_size - GetSizeOfFreeLists();
244 statistics->total_objects = 0;
245 for (size_t i = 0; i < memory_segments_.size(); i++) {
246 MemoryStatistics::SegmentStatistics segment_stats;
247 memory_segments_[i]->GetStatistics(&segment_stats);
248 statistics->segments_stats.push_back(segment_stats);
249 statistics->total_objects += segment_stats.num_of_objects;
250 }
251 }
252
215 void DiscardableSharedMemoryHeap::InsertIntoFreeList( 253 void DiscardableSharedMemoryHeap::InsertIntoFreeList(
216 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { 254 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) {
217 DCHECK(!IsInFreeList(span.get())); 255 DCHECK(!IsInFreeList(span.get()));
218 size_t index = std::min(span->length_, arraysize(free_spans_)) - 1; 256 size_t index = std::min(span->length_, arraysize(free_spans_)) - 1;
219 free_spans_[index].Append(span.release()); 257 free_spans_[index].Append(span.release());
220 } 258 }
221 259
222 scoped_ptr<DiscardableSharedMemoryHeap::Span> 260 scoped_ptr<DiscardableSharedMemoryHeap::Span>
223 DiscardableSharedMemoryHeap::RemoveFromFreeList(Span* span) { 261 DiscardableSharedMemoryHeap::RemoveFromFreeList(Span* span) {
224 DCHECK(IsInFreeList(span)); 262 DCHECK(IsInFreeList(span));
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 // If |span| is in the free list, remove it and update |num_free_blocks_|. 348 // If |span| is in the free list, remove it and update |num_free_blocks_|.
311 if (IsInFreeList(span)) { 349 if (IsInFreeList(span)) {
312 DCHECK_GE(num_free_blocks_, span->length_); 350 DCHECK_GE(num_free_blocks_, span->length_);
313 num_free_blocks_ -= span->length_; 351 num_free_blocks_ -= span->length_;
314 RemoveFromFreeList(span); 352 RemoveFromFreeList(span);
315 } 353 }
316 } 354 }
317 } 355 }
318 356
319 } // namespace content 357 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698