Index: content/child/child_discardable_shared_memory_manager.cc |
diff --git a/content/child/child_discardable_shared_memory_manager.cc b/content/child/child_discardable_shared_memory_manager.cc |
index d91bd15c95a0881fb74f488d5e4cefa1b3c3b734..86822a2aa329fa3fbadeaa0399009664dba958a9 100644 |
--- a/content/child/child_discardable_shared_memory_manager.cc |
+++ b/content/child/child_discardable_shared_memory_manager.cc |
@@ -53,19 +53,17 @@ class DiscardableMemoryShmemChunkImpl |
DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryShmemChunkImpl); |
}; |
-void DeletedDiscardableSharedMemory(scoped_refptr<ThreadSafeSender> sender, |
- DiscardableSharedMemoryId id) { |
- sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); |
-} |
- |
} // namespace |
ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( |
ThreadSafeSender* sender) |
- : heap_(base::GetPageSize()), sender_(sender) { |
+ : heap_(base::GetPageSize()), sender_(sender), weak_ptr_factory_(this) { |
} |
ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { |
+ // Cancel all DeletedDiscardableSharedMemory callbacks. |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+ |
// TODO(reveman): Determine if this DCHECK can be enabled. crbug.com/430533 |
// DCHECK_EQ(heap_.GetSize(), heap_.GetSizeOfFreeLists()); |
if (heap_.GetSize()) |
@@ -150,9 +148,11 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id)); |
// Create span for allocated memory. |
- scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span( |
- heap_.Grow(shared_memory.Pass(), allocation_size_in_bytes, |
- base::Bind(&DeletedDiscardableSharedMemory, sender_, new_id))); |
+ scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow( |
+ shared_memory.Pass(), allocation_size_in_bytes, |
+ base::Bind( |
+ &ChildDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory, |
+ weak_ptr_factory_.GetWeakPtr(), new_id))); |
// Unlock and insert any left over memory into free lists. |
if (pages < pages_to_allocate) { |
@@ -255,6 +255,11 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( |
return memory.Pass(); |
} |
+void ChildDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( |
+ DiscardableSharedMemoryId id) { |
+ sender_->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); |
+} |
+ |
void ChildDiscardableSharedMemoryManager::MemoryUsageChanged( |
size_t new_bytes_total, |
size_t new_bytes_free) const { |