Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: content/child/child_discardable_shared_memory_manager.cc

Issue 1012163002: content: Cancel all DeletedDiscardableSharedMemory callbacks in dtor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/child/child_discardable_shared_memory_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « content/child/child_discardable_shared_memory_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698