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_memory.h" | 10 #include "base/memory/discardable_memory.h" |
11 #include "base/memory/discardable_shared_memory.h" | 11 #include "base/memory/discardable_shared_memory.h" |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/process/memory.h" | 13 #include "base/process/memory.h" |
14 #include "base/process/process_metrics.h" | 14 #include "base/process/process_metrics.h" |
15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
| 16 #include "base/thread_task_runner_handle.h" |
| 17 #include "base/trace_event/memory_dump_manager.h" |
16 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
17 #include "content/common/child_process_messages.h" | 19 #include "content/common/child_process_messages.h" |
18 | 20 |
19 namespace content { | 21 namespace content { |
20 namespace { | 22 namespace { |
21 | 23 |
22 // Default allocation size. | 24 // Default allocation size. |
23 #if defined(OS_ANDROID) | 25 #if defined(OS_ANDROID) |
24 // Larger allocation size on Android to avoid reaching the FD-limit. | 26 // Larger allocation size on Android to avoid reaching the FD-limit. |
25 const size_t kAllocationSize = 32 * 1024 * 1024; | 27 const size_t kAllocationSize = 32 * 1024 * 1024; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 scoped_refptr<ThreadSafeSender> sender, | 78 scoped_refptr<ThreadSafeSender> sender, |
77 DiscardableSharedMemoryId id) { | 79 DiscardableSharedMemoryId id) { |
78 sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); | 80 sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); |
79 } | 81 } |
80 | 82 |
81 } // namespace | 83 } // namespace |
82 | 84 |
83 ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( | 85 ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( |
84 ThreadSafeSender* sender) | 86 ThreadSafeSender* sender) |
85 : heap_(base::GetPageSize()), sender_(sender) { | 87 : heap_(base::GetPageSize()), sender_(sender) { |
| 88 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| 89 this, base::ThreadTaskRunnerHandle::Get()); |
86 } | 90 } |
87 | 91 |
88 ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { | 92 ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { |
| 93 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
| 94 this); |
89 // TODO(reveman): Determine if this DCHECK can be enabled. crbug.com/430533 | 95 // TODO(reveman): Determine if this DCHECK can be enabled. crbug.com/430533 |
90 // DCHECK_EQ(heap_.GetSize(), heap_.GetSizeOfFreeLists()); | 96 // DCHECK_EQ(heap_.GetSize(), heap_.GetSizeOfFreeLists()); |
91 if (heap_.GetSize()) | 97 if (heap_.GetSize()) |
92 MemoryUsageChanged(0, 0); | 98 MemoryUsageChanged(0, 0); |
93 } | 99 } |
94 | 100 |
95 scoped_ptr<base::DiscardableMemory> | 101 scoped_ptr<base::DiscardableMemory> |
96 ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( | 102 ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
97 size_t size) { | 103 size_t size) { |
98 base::AutoLock lock(lock_); | 104 base::AutoLock lock(lock_); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 | 169 |
164 DiscardableSharedMemoryId new_id = | 170 DiscardableSharedMemoryId new_id = |
165 g_next_discardable_shared_memory_id.GetNext(); | 171 g_next_discardable_shared_memory_id.GetNext(); |
166 | 172 |
167 // Ask parent process to allocate a new discardable shared memory segment. | 173 // Ask parent process to allocate a new discardable shared memory segment. |
168 scoped_ptr<base::DiscardableSharedMemory> shared_memory( | 174 scoped_ptr<base::DiscardableSharedMemory> shared_memory( |
169 AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id)); | 175 AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id)); |
170 | 176 |
171 // Create span for allocated memory. | 177 // Create span for allocated memory. |
172 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow( | 178 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow( |
173 shared_memory.Pass(), allocation_size_in_bytes, | 179 shared_memory.Pass(), allocation_size_in_bytes, new_id, |
174 base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id))); | 180 base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id))); |
175 | 181 |
176 // Unlock and insert any left over memory into free lists. | 182 // Unlock and insert any left over memory into free lists. |
177 if (pages < pages_to_allocate) { | 183 if (pages < pages_to_allocate) { |
178 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = | 184 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = |
179 heap_.Split(new_span.get(), pages); | 185 heap_.Split(new_span.get(), pages); |
180 leftover->shared_memory()->Unlock( | 186 leftover->shared_memory()->Unlock( |
181 leftover->start() * base::GetPageSize() - | 187 leftover->start() * base::GetPageSize() - |
182 reinterpret_cast<size_t>(leftover->shared_memory()->memory()), | 188 reinterpret_cast<size_t>(leftover->shared_memory()->memory()), |
183 leftover->length() * base::GetPageSize()); | 189 leftover->length() * base::GetPageSize()); |
184 heap_.MergeIntoFreeLists(leftover.Pass()); | 190 heap_.MergeIntoFreeLists(leftover.Pass()); |
185 } | 191 } |
186 | 192 |
187 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); | 193 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); |
188 | 194 |
189 return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass())); | 195 return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass())); |
190 } | 196 } |
191 | 197 |
| 198 bool ChildDiscardableSharedMemoryManager::OnMemoryDump( |
| 199 base::trace_event::ProcessMemoryDump* pmd) { |
| 200 return heap_.OnMemoryDump(pmd); |
| 201 } |
| 202 |
192 void ChildDiscardableSharedMemoryManager::ReleaseFreeMemory() { | 203 void ChildDiscardableSharedMemoryManager::ReleaseFreeMemory() { |
193 base::AutoLock lock(lock_); | 204 base::AutoLock lock(lock_); |
194 | 205 |
195 size_t heap_size_prior_to_releasing_memory = heap_.GetSize(); | 206 size_t heap_size_prior_to_releasing_memory = heap_.GetSize(); |
196 | 207 |
197 // Release both purged and free memory. | 208 // Release both purged and free memory. |
198 heap_.ReleasePurgedMemory(); | 209 heap_.ReleasePurgedMemory(); |
199 heap_.ReleaseFreeMemory(); | 210 heap_.ReleaseFreeMemory(); |
200 | 211 |
201 if (heap_.GetSize() != heap_size_prior_to_releasing_memory) | 212 if (heap_.GetSize() != heap_size_prior_to_releasing_memory) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 "discardable-memory-allocated"; | 294 "discardable-memory-allocated"; |
284 base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey, | 295 base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey, |
285 base::Uint64ToString(new_bytes_total)); | 296 base::Uint64ToString(new_bytes_total)); |
286 | 297 |
287 static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free"; | 298 static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free"; |
288 base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey, | 299 base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey, |
289 base::Uint64ToString(new_bytes_free)); | 300 base::Uint64ToString(new_bytes_free)); |
290 } | 301 } |
291 | 302 |
292 } // namespace content | 303 } // namespace content |
OLD | NEW |