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 b1a6b8098267b189dd218c6e196a80fea27c810b..bd62a93b6dfebdfc185131b3f6cc5d5f57fba703 100644 |
--- a/content/child/child_discardable_shared_memory_manager.cc |
+++ b/content/child/child_discardable_shared_memory_manager.cc |
@@ -4,8 +4,11 @@ |
#include "content/child/child_discardable_shared_memory_manager.h" |
+#include "base/debug/crash_logging.h" |
#include "base/memory/discardable_shared_memory.h" |
#include "base/process/process_metrics.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "base/trace_event/trace_event.h" |
#include "content/common/child_process_messages.h" |
namespace content { |
@@ -43,10 +46,12 @@ class DiscardableMemoryShmemChunkImpl |
ChildDiscardableSharedMemoryManager::ChildDiscardableSharedMemoryManager( |
ThreadSafeSender* sender) |
- : heap_(base::GetPageSize()), sender_(sender) { |
+ : heap_(base::GetPageSize()), sender_(sender), bytes_allocated_(0) { |
} |
ChildDiscardableSharedMemoryManager::~ChildDiscardableSharedMemoryManager() { |
+ if (bytes_allocated_) |
+ BytesAllocatedChanged(0); |
} |
scoped_ptr<base::DiscardableMemoryShmemChunk> |
@@ -75,7 +80,11 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
base::DiscardableSharedMemory::FAILED) { |
DCHECK(!free_span->shared_memory()->IsMemoryResident()); |
// We have to release free memory before |free_span| can be destroyed. |
- heap_.ReleaseFreeMemory(); |
+ size_t bytes_released = heap_.ReleaseFreeMemory(); |
+ DCHECK_NE(bytes_released, 0u); |
+ DCHECK_LE(bytes_released, bytes_allocated_); |
+ bytes_allocated_ -= bytes_released; |
+ BytesAllocatedChanged(bytes_allocated_); |
DCHECK(!free_span->shared_memory()); |
continue; |
} |
@@ -86,7 +95,12 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
// Release free memory and free up the address space. Failing to do this |
// can result in the child process running out of address space. |
- heap_.ReleaseFreeMemory(); |
+ size_t bytes_released = heap_.ReleaseFreeMemory(); |
+ if (bytes_released) { |
+ DCHECK_LE(bytes_released, bytes_allocated_); |
+ bytes_allocated_ -= bytes_released; |
+ BytesAllocatedChanged(bytes_allocated_); |
+ } |
size_t pages_to_allocate = |
std::max(kAllocationSize / base::GetPageSize(), pages); |
@@ -96,6 +110,11 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
scoped_ptr<base::DiscardableSharedMemory> shared_memory( |
AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes)); |
+ // Note: use mapped size rather than |allocation_size_in_bytes| as |
+ // the later only represent the amount of memory available for usage. |
Avi (use Gerrit)
2015/02/26 16:21:15
... the latter only represents ...
reveman
2015/02/26 16:55:44
Done.
|
+ bytes_allocated_ += shared_memory->mapped_size(); |
+ BytesAllocatedChanged(bytes_allocated_); |
+ |
// Create span for allocated memory. |
scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span( |
heap_.Grow(shared_memory.Pass(), allocation_size_in_bytes)); |
@@ -118,7 +137,12 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory( |
void ChildDiscardableSharedMemoryManager::ReleaseFreeMemory() { |
base::AutoLock lock(lock_); |
- heap_.ReleaseFreeMemory(); |
+ size_t bytes_released = heap_.ReleaseFreeMemory(); |
+ if (bytes_released) { |
+ DCHECK_LE(bytes_released, bytes_allocated_); |
+ bytes_allocated_ -= bytes_released; |
+ BytesAllocatedChanged(bytes_allocated_); |
+ } |
} |
bool ChildDiscardableSharedMemoryManager::LockSpan( |
@@ -194,4 +218,14 @@ ChildDiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( |
return memory.Pass(); |
} |
+void ChildDiscardableSharedMemoryManager::BytesAllocatedChanged( |
+ size_t new_bytes_allocated) const { |
+ TRACE_COUNTER_ID1("renderer", "DiscardableMemoryUsage", this, |
+ new_bytes_allocated); |
+ |
+ static const char kDiscardableMemoryUsageKey[] = "dm-usage"; |
+ base::debug::SetCrashKeyValue(kDiscardableMemoryUsageKey, |
+ base::Uint64ToString(new_bytes_allocated)); |
+} |
+ |
} // namespace content |