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 7f11461e5966122f97afefe7a22f189b08a453cb..d91bd15c95a0881fb74f488d5e4cefa1b3c3b734 100644 |
--- a/content/child/child_discardable_shared_memory_manager.cc |
+++ b/content/child/child_discardable_shared_memory_manager.cc |
@@ -4,6 +4,8 @@ |
#include "content/child/child_discardable_shared_memory_manager.h" |
+#include "base/atomic_sequence_num.h" |
+#include "base/bind.h" |
#include "base/debug/crash_logging.h" |
#include "base/memory/discardable_shared_memory.h" |
#include "base/metrics/histogram.h" |
@@ -23,6 +25,9 @@ const size_t kAllocationSize = 32 * 1024 * 1024; |
const size_t kAllocationSize = 4 * 1024 * 1024; |
#endif |
+// Global atomic to generate unique discardable shared memory IDs. |
+base::StaticAtomicSequenceNumber g_next_discardable_shared_memory_id; |
+ |
class DiscardableMemoryShmemChunkImpl |
: public base::DiscardableMemoryShmemChunk { |
public: |
@@ -48,6 +53,11 @@ class DiscardableMemoryShmemChunkImpl |
DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryShmemChunkImpl); |
}; |
+void DeletedDiscardableSharedMemory(scoped_refptr<ThreadSafeSender> sender, |
+ DiscardableSharedMemoryId id) { |
+ sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); |
+} |
+ |
} // namespace |
ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( |
@@ -132,13 +142,17 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
std::max(kAllocationSize / base::GetPageSize(), pages); |
size_t allocation_size_in_bytes = pages_to_allocate * base::GetPageSize(); |
+ DiscardableSharedMemoryId new_id = |
+ g_next_discardable_shared_memory_id.GetNext(); |
+ |
// Ask parent process to allocate a new discardable shared memory segment. |
scoped_ptr<base::DiscardableSharedMemory> shared_memory( |
- AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes)); |
+ 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)); |
+ heap_.Grow(shared_memory.Pass(), allocation_size_in_bytes, |
+ base::Bind(&DeletedDiscardableSharedMemory, sender_, new_id))); |
// Unlock and insert any left over memory into free lists. |
if (pages < pages_to_allocate) { |
@@ -223,17 +237,17 @@ void ChildDiscardableSharedMemoryManager::ReleaseSpan( |
scoped_ptr<base::DiscardableSharedMemory> |
ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( |
- size_t size) { |
- TRACE_EVENT1("renderer", |
+ size_t size, |
+ DiscardableSharedMemoryId id) { |
+ TRACE_EVENT2("renderer", |
"ChildDiscardableSharedMemoryManager::" |
"AllocateLockedDiscardableSharedMemory", |
- "size", |
- size); |
+ "size", size, "id", id); |
base::SharedMemoryHandle handle = base::SharedMemory::NULLHandle(); |
sender_->Send( |
new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( |
- size, &handle)); |
+ size, id, &handle)); |
CHECK(base::SharedMemory::IsHandleValid(handle)); |
scoped_ptr<base::DiscardableSharedMemory> memory( |
new base::DiscardableSharedMemory(handle)); |