Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |