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 |