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..d94eb3e550c5a7c2a5f9a7e84a2f2575b2830001 100644 |
--- a/content/child/child_discardable_shared_memory_manager.cc |
+++ b/content/child/child_discardable_shared_memory_manager.cc |
@@ -7,6 +7,7 @@ |
#include "base/atomic_sequence_num.h" |
#include "base/bind.h" |
#include "base/debug/crash_logging.h" |
+#include "base/memory/discardable_memory.h" |
#include "base/memory/discardable_shared_memory.h" |
#include "base/metrics/histogram.h" |
#include "base/process/process_metrics.h" |
@@ -28,29 +29,46 @@ const size_t kAllocationSize = 4 * 1024 * 1024; |
// Global atomic to generate unique discardable shared memory IDs. |
base::StaticAtomicSequenceNumber g_next_discardable_shared_memory_id; |
-class DiscardableMemoryShmemChunkImpl |
- : public base::DiscardableMemoryShmemChunk { |
+class DiscardableMemoryImpl : public base::DiscardableMemory { |
public: |
- DiscardableMemoryShmemChunkImpl( |
- ChildDiscardableSharedMemoryManager* manager, |
- scoped_ptr<DiscardableSharedMemoryHeap::Span> span) |
- : manager_(manager), span_(span.Pass()) {} |
- ~DiscardableMemoryShmemChunkImpl() override { |
+ DiscardableMemoryImpl(ChildDiscardableSharedMemoryManager* manager, |
+ scoped_ptr<DiscardableSharedMemoryHeap::Span> span) |
+ : manager_(manager), span_(span.Pass()), is_locked_(true) {} |
+ |
+ ~DiscardableMemoryImpl() override { |
+ if (is_locked_) |
+ manager_->UnlockSpan(span_.get()); |
+ |
manager_->ReleaseSpan(span_.Pass()); |
} |
- // Overridden from DiscardableMemoryShmemChunk: |
- bool Lock() override { return manager_->LockSpan(span_.get()); } |
- void Unlock() override { manager_->UnlockSpan(span_.get()); } |
+ // Overridden from base::DiscardableMemory: |
+ bool Lock() override { |
+ DCHECK(!is_locked_); |
+ |
+ if (!manager_->LockSpan(span_.get())) |
+ return false; |
+ |
+ is_locked_ = true; |
+ return true; |
+ } |
+ void Unlock() override { |
+ DCHECK(is_locked_); |
+ |
+ manager_->UnlockSpan(span_.get()); |
+ is_locked_ = false; |
+ } |
void* Memory() const override { |
+ DCHECK(is_locked_); |
return reinterpret_cast<void*>(span_->start() * base::GetPageSize()); |
} |
private: |
- ChildDiscardableSharedMemoryManager* manager_; |
+ ChildDiscardableSharedMemoryManager* const manager_; |
scoped_ptr<DiscardableSharedMemoryHeap::Span> span_; |
+ bool is_locked_; |
- DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryShmemChunkImpl); |
+ DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryImpl); |
}; |
void DeletedDiscardableSharedMemory(scoped_refptr<ThreadSafeSender> sender, |
@@ -72,7 +90,7 @@ ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { |
MemoryUsageChanged(0, 0); |
} |
-scoped_ptr<base::DiscardableMemoryShmemChunk> |
+scoped_ptr<base::DiscardableMemory> |
ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
size_t size) { |
base::AutoLock lock(lock_); |
@@ -126,8 +144,7 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
// at least one span from the free lists. |
MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); |
- return make_scoped_ptr( |
- new DiscardableMemoryShmemChunkImpl(this, free_span.Pass())); |
+ return make_scoped_ptr(new DiscardableMemoryImpl(this, free_span.Pass())); |
} |
// Release purged memory to free up the address space before we attempt to |
@@ -167,8 +184,7 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); |
- return make_scoped_ptr( |
- new DiscardableMemoryShmemChunkImpl(this, new_span.Pass())); |
+ return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass())); |
} |
void ChildDiscardableSharedMemoryManager::ReleaseFreeMemory() { |