summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreveman <reveman@chromium.org>2015-03-27 15:50:27 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-27 22:51:17 +0000
commitfc8a910c301cc98f5667dfc353e9ba817a78d378 (patch)
tree5a3644c1ebdf59412a744dd22312d48e82849ce5
parentdb35cf90e284157327da47bb33f344c0d4bad4fc (diff)
downloadchromium_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.cc20
-rw-r--r--content/child/child_discardable_shared_memory_manager.h3
-rw-r--r--content/child/child_thread_impl.cc4
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());