| 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/child/child_discardable_shared_memory_manager.h" | 5 #include "content/child/child_discardable_shared_memory_manager.h" |
| 6 | 6 |
| 7 #include "base/atomic_sequence_num.h" | 7 #include "base/atomic_sequence_num.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
| 10 #include "base/memory/discardable_shared_memory.h" | 10 #include "base/memory/discardable_shared_memory.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 return reinterpret_cast<void*>(span_->start() * base::GetPageSize()); | 46 return reinterpret_cast<void*>(span_->start() * base::GetPageSize()); |
| 47 } | 47 } |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 ChildDiscardableSharedMemoryManager* manager_; | 50 ChildDiscardableSharedMemoryManager* manager_; |
| 51 scoped_ptr<DiscardableSharedMemoryHeap::Span> span_; | 51 scoped_ptr<DiscardableSharedMemoryHeap::Span> span_; |
| 52 | 52 |
| 53 DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryShmemChunkImpl); | 53 DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryShmemChunkImpl); |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 void DeletedDiscardableSharedMemory(scoped_refptr<ThreadSafeSender> sender, | |
| 57 DiscardableSharedMemoryId id) { | |
| 58 sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); | |
| 59 } | |
| 60 | |
| 61 } // namespace | 56 } // namespace |
| 62 | 57 |
| 63 ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( | 58 ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( |
| 64 ThreadSafeSender* sender) | 59 ThreadSafeSender* sender) |
| 65 : heap_(base::GetPageSize()), sender_(sender) { | 60 : heap_(base::GetPageSize()), sender_(sender), weak_ptr_factory_(this) { |
| 66 } | 61 } |
| 67 | 62 |
| 68 ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { | 63 ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { |
| 64 // Cancel all DeletedDiscardableSharedMemory callbacks. |
| 65 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 66 |
| 69 // TODO(reveman): Determine if this DCHECK can be enabled. crbug.com/430533 | 67 // TODO(reveman): Determine if this DCHECK can be enabled. crbug.com/430533 |
| 70 // DCHECK_EQ(heap_.GetSize(), heap_.GetSizeOfFreeLists()); | 68 // DCHECK_EQ(heap_.GetSize(), heap_.GetSizeOfFreeLists()); |
| 71 if (heap_.GetSize()) | 69 if (heap_.GetSize()) |
| 72 MemoryUsageChanged(0, 0); | 70 MemoryUsageChanged(0, 0); |
| 73 } | 71 } |
| 74 | 72 |
| 75 scoped_ptr<base::DiscardableMemoryShmemChunk> | 73 scoped_ptr<base::DiscardableMemoryShmemChunk> |
| 76 ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( | 74 ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
| 77 size_t size) { | 75 size_t size) { |
| 78 base::AutoLock lock(lock_); | 76 base::AutoLock lock(lock_); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 size_t allocation_size_in_bytes = pages_to_allocate * base::GetPageSize(); | 141 size_t allocation_size_in_bytes = pages_to_allocate * base::GetPageSize(); |
| 144 | 142 |
| 145 DiscardableSharedMemoryId new_id = | 143 DiscardableSharedMemoryId new_id = |
| 146 g_next_discardable_shared_memory_id.GetNext(); | 144 g_next_discardable_shared_memory_id.GetNext(); |
| 147 | 145 |
| 148 // Ask parent process to allocate a new discardable shared memory segment. | 146 // Ask parent process to allocate a new discardable shared memory segment. |
| 149 scoped_ptr<base::DiscardableSharedMemory> shared_memory( | 147 scoped_ptr<base::DiscardableSharedMemory> shared_memory( |
| 150 AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id)); | 148 AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id)); |
| 151 | 149 |
| 152 // Create span for allocated memory. | 150 // Create span for allocated memory. |
| 153 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span( | 151 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow( |
| 154 heap_.Grow(shared_memory.Pass(), allocation_size_in_bytes, | 152 shared_memory.Pass(), allocation_size_in_bytes, |
| 155 base::Bind(&DeletedDiscardableSharedMemory, sender_, new_id))); | 153 base::Bind( |
| 154 &ChildDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory, |
| 155 weak_ptr_factory_.GetWeakPtr(), new_id))); |
| 156 | 156 |
| 157 // Unlock and insert any left over memory into free lists. | 157 // Unlock and insert any left over memory into free lists. |
| 158 if (pages < pages_to_allocate) { | 158 if (pages < pages_to_allocate) { |
| 159 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = | 159 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = |
| 160 heap_.Split(new_span.get(), pages); | 160 heap_.Split(new_span.get(), pages); |
| 161 leftover->shared_memory()->Unlock( | 161 leftover->shared_memory()->Unlock( |
| 162 leftover->start() * base::GetPageSize() - | 162 leftover->start() * base::GetPageSize() - |
| 163 reinterpret_cast<size_t>(leftover->shared_memory()->memory()), | 163 reinterpret_cast<size_t>(leftover->shared_memory()->memory()), |
| 164 leftover->length() * base::GetPageSize()); | 164 leftover->length() * base::GetPageSize()); |
| 165 heap_.MergeIntoFreeLists(leftover.Pass()); | 165 heap_.MergeIntoFreeLists(leftover.Pass()); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 sender_->Send( | 248 sender_->Send( |
| 249 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( | 249 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( |
| 250 size, id, &handle)); | 250 size, id, &handle)); |
| 251 CHECK(base::SharedMemory::IsHandleValid(handle)); | 251 CHECK(base::SharedMemory::IsHandleValid(handle)); |
| 252 scoped_ptr<base::DiscardableSharedMemory> memory( | 252 scoped_ptr<base::DiscardableSharedMemory> memory( |
| 253 new base::DiscardableSharedMemory(handle)); | 253 new base::DiscardableSharedMemory(handle)); |
| 254 CHECK(memory->Map(size)); | 254 CHECK(memory->Map(size)); |
| 255 return memory.Pass(); | 255 return memory.Pass(); |
| 256 } | 256 } |
| 257 | 257 |
| 258 void ChildDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( |
| 259 DiscardableSharedMemoryId id) { |
| 260 sender_->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); |
| 261 } |
| 262 |
| 258 void ChildDiscardableSharedMemoryManager::MemoryUsageChanged( | 263 void ChildDiscardableSharedMemoryManager::MemoryUsageChanged( |
| 259 size_t new_bytes_total, | 264 size_t new_bytes_total, |
| 260 size_t new_bytes_free) const { | 265 size_t new_bytes_free) const { |
| 261 TRACE_COUNTER2("renderer", "DiscardableMemoryUsage", "allocated", | 266 TRACE_COUNTER2("renderer", "DiscardableMemoryUsage", "allocated", |
| 262 new_bytes_total - new_bytes_free, "free", new_bytes_free); | 267 new_bytes_total - new_bytes_free, "free", new_bytes_free); |
| 263 | 268 |
| 264 static const char kDiscardableMemoryUsageKey[] = "dm-usage"; | 269 static const char kDiscardableMemoryUsageKey[] = "dm-usage"; |
| 265 base::debug::SetCrashKeyValue(kDiscardableMemoryUsageKey, | 270 base::debug::SetCrashKeyValue(kDiscardableMemoryUsageKey, |
| 266 base::Uint64ToString(new_bytes_total)); | 271 base::Uint64ToString(new_bytes_total)); |
| 267 | 272 |
| 268 static const char kDiscardableMemoryUsageFreeKey[] = "dm-usage-free"; | 273 static const char kDiscardableMemoryUsageFreeKey[] = "dm-usage-free"; |
| 269 base::debug::SetCrashKeyValue(kDiscardableMemoryUsageFreeKey, | 274 base::debug::SetCrashKeyValue(kDiscardableMemoryUsageFreeKey, |
| 270 base::Uint64ToString(new_bytes_free)); | 275 base::Uint64ToString(new_bytes_free)); |
| 271 } | 276 } |
| 272 | 277 |
| 273 } // namespace content | 278 } // namespace content |
| OLD | NEW |