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 #include "base/strings/stringprintf.h" | |
| 10 | 11 |
| 11 namespace content { | 12 namespace content { |
| 12 namespace { | 13 namespace { |
| 13 | 14 |
| 14 bool IsPowerOfTwo(size_t x) { | 15 bool IsPowerOfTwo(size_t x) { |
| 15 return (x & (x - 1)) == 0; | 16 return (x & (x - 1)) == 0; |
| 16 } | 17 } |
| 17 | 18 |
| 18 bool IsInFreeList(DiscardableSharedMemoryHeap::Span* span) { | 19 bool IsInFreeList(DiscardableSharedMemoryHeap::Span* span) { |
| 19 return span->previous() || span->next(); | 20 return span->previous() || span->next(); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 205 } | 206 } |
| 206 | 207 |
| 207 size_t DiscardableSharedMemoryHeap::GetSize() const { | 208 size_t DiscardableSharedMemoryHeap::GetSize() const { |
| 208 return num_blocks_ * block_size_; | 209 return num_blocks_ * block_size_; |
| 209 } | 210 } |
| 210 | 211 |
| 211 size_t DiscardableSharedMemoryHeap::GetSizeOfFreeLists() const { | 212 size_t DiscardableSharedMemoryHeap::GetSizeOfFreeLists() const { |
| 212 return num_free_blocks_ * block_size_; | 213 return num_free_blocks_ * block_size_; |
| 213 } | 214 } |
| 214 | 215 |
| 216 bool DiscardableSharedMemoryHeap::DumpMemoryStatisticsInto( | |
| 217 base::trace_event::ProcessMemoryDump* pmd) { | |
| 218 for (size_t segment = 0; segment < memory_segments_.size(); segment++) { | |
|
reveman
2015/04/24 14:19:36
Would be nice to do something c++-ish like Release
ssid
2015/04/27 11:19:20
Thanks done.
| |
| 219 std::string segment_id = base::StringPrintf("segment_%zu", segment); | |
|
reveman
2015/04/24 14:19:36
nit: maybe move "segment" string to a kMemoryAlloc
ssid
2015/04/27 11:19:20
Done.
| |
| 220 base::trace_event::MemoryAllocatorDump* segment_dump = | |
| 221 pmd->CreateAllocatorDump("discardable", segment_id.c_str()); | |
|
reveman
2015/04/24 14:19:36
nit: and maybe move this string to a kMemoryAlloca
ssid
2015/04/27 11:19:20
Done.
| |
| 222 | |
| 223 size_t num_of_objects = 0; | |
|
reveman
2015/04/24 14:19:36
nit: allocated_objects_count
Might as well keep t
ssid
2015/04/27 11:19:20
Done.
| |
| 224 size_t used_size = 0; | |
|
reveman
2015/04/24 14:19:36
nit: allocated_objects_size_in_bytes
ssid
2015/04/27 11:19:20
Done.
| |
| 225 size_t offset = reinterpret_cast<size_t>( | |
| 226 memory_segments_[segment]->shared_memory_->memory()) / | |
| 227 block_size_; | |
| 228 size_t end = offset + memory_segments_[segment]->size_ / block_size_; | |
| 229 while (offset < end) { | |
| 230 Span* span = spans_[offset]; | |
| 231 if (!IsInFreeList(span)) { | |
| 232 num_of_objects++; | |
| 233 used_size += span->length_; | |
| 234 } | |
| 235 offset += span->length_; | |
| 236 } | |
| 237 | |
| 238 segment_dump->set_physical_size_in_bytes( | |
| 239 static_cast<int>(memory_segments_[segment]->size_)); | |
| 240 segment_dump->set_allocated_objects_count(static_cast<int>(num_of_objects)); | |
| 241 segment_dump->set_allocated_objects_size_in_bytes( | |
| 242 static_cast<int>(used_size)); | |
| 243 } | |
| 244 return true; | |
| 245 } | |
| 246 | |
| 215 void DiscardableSharedMemoryHeap::InsertIntoFreeList( | 247 void DiscardableSharedMemoryHeap::InsertIntoFreeList( |
| 216 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { | 248 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { |
| 217 DCHECK(!IsInFreeList(span.get())); | 249 DCHECK(!IsInFreeList(span.get())); |
| 218 size_t index = std::min(span->length_, arraysize(free_spans_)) - 1; | 250 size_t index = std::min(span->length_, arraysize(free_spans_)) - 1; |
| 219 free_spans_[index].Append(span.release()); | 251 free_spans_[index].Append(span.release()); |
| 220 } | 252 } |
| 221 | 253 |
| 222 scoped_ptr<DiscardableSharedMemoryHeap::Span> | 254 scoped_ptr<DiscardableSharedMemoryHeap::Span> |
| 223 DiscardableSharedMemoryHeap::RemoveFromFreeList(Span* span) { | 255 DiscardableSharedMemoryHeap::RemoveFromFreeList(Span* span) { |
| 224 DCHECK(IsInFreeList(span)); | 256 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_|. | 342 // If |span| is in the free list, remove it and update |num_free_blocks_|. |
| 311 if (IsInFreeList(span)) { | 343 if (IsInFreeList(span)) { |
| 312 DCHECK_GE(num_free_blocks_, span->length_); | 344 DCHECK_GE(num_free_blocks_, span->length_); |
| 313 num_free_blocks_ -= span->length_; | 345 num_free_blocks_ -= span->length_; |
| 314 RemoveFromFreeList(span); | 346 RemoveFromFreeList(span); |
| 315 } | 347 } |
| 316 } | 348 } |
| 317 } | 349 } |
| 318 | 350 |
| 319 } // namespace content | 351 } // namespace content |
| OLD | NEW |