diff options
author | reveman <reveman@chromium.org> | 2015-03-27 15:50:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-27 22:51:17 +0000 |
commit | fc8a910c301cc98f5667dfc353e9ba817a78d378 (patch) | |
tree | 5a3644c1ebdf59412a744dd22312d48e82849ce5 | |
parent | db35cf90e284157327da47bb33f344c0d4bad4fc (diff) | |
download | chromium_src-fc8a910c301cc98f5667dfc353e9ba817a78d378.zip chromium_src-fc8a910c301cc98f5667dfc353e9ba817a78d378.tar.gz chromium_src-fc8a910c301cc98f5667dfc353e9ba817a78d378.tar.bz2 |
content: Remove non-thread-safe use of WeakPtrs.
Instead of avoiding to send IPC from ChildDiscardableSharedMemoryManager
dtor, make sure ThreadSafeSender instance is still valid at the
time dtor is called.
BUG=471246
Review URL: https://codereview.chromium.org/1035313002
Cr-Commit-Position: refs/heads/master@{#322665}
-rw-r--r-- | content/child/child_discardable_shared_memory_manager.cc | 20 | ||||
-rw-r--r-- | content/child/child_discardable_shared_memory_manager.h | 3 | ||||
-rw-r--r-- | content/child/child_thread_impl.cc | 4 |
3 files changed, 12 insertions, 15 deletions
diff --git a/content/child/child_discardable_shared_memory_manager.cc b/content/child/child_discardable_shared_memory_manager.cc index 3b11398..73b4cb1 100644 --- a/content/child/child_discardable_shared_memory_manager.cc +++ b/content/child/child_discardable_shared_memory_manager.cc @@ -72,17 +72,20 @@ class DiscardableMemoryImpl : public base::DiscardableMemory { DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryImpl); }; +void SendDeletedDiscardableSharedMemoryMessage( + scoped_refptr<ThreadSafeSender> sender, + DiscardableSharedMemoryId id) { + sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); +} + } // namespace ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( ThreadSafeSender* sender) - : heap_(base::GetPageSize()), sender_(sender), weak_ptr_factory_(this) { + : heap_(base::GetPageSize()), sender_(sender) { } 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()) @@ -168,9 +171,7 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( // Create span for allocated memory. 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))); + base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id))); // Unlock and insert any left over memory into free lists. if (pages < pages_to_allocate) { @@ -272,11 +273,6 @@ 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 { diff --git a/content/child/child_discardable_shared_memory_manager.h b/content/child/child_discardable_shared_memory_manager.h index 3dee173..881b59e 100644 --- a/content/child/child_discardable_shared_memory_manager.h +++ b/content/child/child_discardable_shared_memory_manager.h @@ -7,7 +7,6 @@ #include "base/memory/discardable_memory_allocator.h" #include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" #include "content/child/thread_safe_sender.h" #include "content/common/content_export.h" @@ -39,14 +38,12 @@ class CONTENT_EXPORT ChildDiscardableSharedMemoryManager scoped_ptr<base::DiscardableSharedMemory> AllocateLockedDiscardableSharedMemory(size_t size, DiscardableSharedMemoryId id); - void DeletedDiscardableSharedMemory(DiscardableSharedMemoryId id); void MemoryUsageChanged(size_t new_bytes_allocated, size_t new_bytes_free) const; mutable base::Lock lock_; DiscardableSharedMemoryHeap heap_; scoped_refptr<ThreadSafeSender> sender_; - base::WeakPtrFactory<ChildDiscardableSharedMemoryManager> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ChildDiscardableSharedMemoryManager); }; diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc index 41c5543..c82f791 100644 --- a/content/child/child_thread_impl.cc +++ b/content/child/child_thread_impl.cc @@ -477,6 +477,10 @@ void ChildThreadImpl::Init(const Options& options) { } ChildThreadImpl::~ChildThreadImpl() { + // ChildDiscardableSharedMemoryManager has to be destroyed while + // |thread_safe_sender_| is still valid. + discardable_shared_memory_manager_.reset(); + #if defined(OS_ANDROID) { base::AutoLock lock(g_lazy_child_thread_lock.Get()); |