Index: base/trace_event/process_memory_dump.cc |
diff --git a/base/trace_event/process_memory_dump.cc b/base/trace_event/process_memory_dump.cc |
index ada6aa449e210b58158c6e02223086751b90de4b..82698662fa66af316c38dcb938ca7f0d50bbba82 100644 |
--- a/base/trace_event/process_memory_dump.cc |
+++ b/base/trace_event/process_memory_dump.cc |
@@ -12,6 +12,8 @@ |
#include "base/process/process_metrics.h" |
#include "base/strings/stringprintf.h" |
#include "base/trace_event/heap_profiler_heap_dump_writer.h" |
+#include "base/trace_event/memory_dump_request_args.h" |
+#include "base/trace_event/memory_infra_background_whitelist.h" |
#include "base/trace_event/process_memory_totals.h" |
#include "base/trace_event/trace_event_argument.h" |
#include "build/build_config.h" |
@@ -148,28 +150,44 @@ size_t ProcessMemoryDump::CountResidentBytes(void* start_address, |
#endif // defined(COUNT_RESIDENT_BYTES_SUPPORTED) |
ProcessMemoryDump::ProcessMemoryDump( |
- scoped_refptr<MemoryDumpSessionState> session_state) |
+ scoped_refptr<MemoryDumpSessionState> session_state, |
+ const MemoryDumpArgs& dump_args) |
: has_process_totals_(false), |
has_process_mmaps_(false), |
- session_state_(std::move(session_state)) {} |
+ session_state_(std::move(session_state)), |
+ dump_args_(dump_args) { |
+ if (dump_args_.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND) { |
+ black_hole_mad_.reset(new MemoryAllocatorDump("dummy", this)); |
Primiano Tucci (use gerrit)
2016/06/02 20:24:04
I'd create this only if we need it. If we do every
ssid
2016/06/03 01:59:46
Added a get method. dcheck_ne was added because of
|
+ } |
+} |
ProcessMemoryDump::~ProcessMemoryDump() {} |
MemoryAllocatorDump* ProcessMemoryDump::CreateAllocatorDump( |
const std::string& absolute_name) { |
- return AddAllocatorDumpInternal( |
+ auto mad = AddAllocatorDumpInternal( |
WrapUnique(new MemoryAllocatorDump(absolute_name, this))); |
+ DCHECK_NE(black_hole_mad_.get(), mad); |
+ return mad; |
Primiano Tucci (use gerrit)
2016/06/02 20:24:04
you can keep this as it was if you use the helper.
ssid
2016/06/03 01:59:46
This is what I tried to explain in my previous com
|
} |
MemoryAllocatorDump* ProcessMemoryDump::CreateAllocatorDump( |
const std::string& absolute_name, |
const MemoryAllocatorDumpGuid& guid) { |
- return AddAllocatorDumpInternal( |
+ auto mad = AddAllocatorDumpInternal( |
WrapUnique(new MemoryAllocatorDump(absolute_name, this, guid))); |
+ DCHECK_NE(black_hole_mad_.get(), mad); |
+ return mad; |
} |
MemoryAllocatorDump* ProcessMemoryDump::AddAllocatorDumpInternal( |
std::unique_ptr<MemoryAllocatorDump> mad) { |
+ // In background mode return dummy dump if invalid dump name is given. |
+ if (dump_args_.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND && |
+ !IsMemoryAllocatorDumpNameWhitelisted(mad->absolute_name())) { |
+ return black_hole_mad_.get(); |
+ } |
+ |
auto insertion_result = allocator_dumps_.insert( |
std::make_pair(mad->absolute_name(), std::move(mad))); |
MemoryAllocatorDump* inserted_mad = insertion_result.first->second.get(); |
@@ -181,7 +199,11 @@ MemoryAllocatorDump* ProcessMemoryDump::AddAllocatorDumpInternal( |
MemoryAllocatorDump* ProcessMemoryDump::GetAllocatorDump( |
const std::string& absolute_name) const { |
auto it = allocator_dumps_.find(absolute_name); |
- return it == allocator_dumps_.end() ? nullptr : it->second.get(); |
+ if (it != allocator_dumps_.end()) |
+ return it->second.get(); |
+ return dump_args_.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND |
Primiano Tucci (use gerrit)
2016/06/02 20:24:04
nit: At this point stay consistent and keep doing:
ssid
2016/06/03 01:59:46
Done.
|
+ ? black_hole_mad_.get() |
+ : nullptr; |
} |
MemoryAllocatorDump* ProcessMemoryDump::GetOrCreateAllocatorDump( |
@@ -192,6 +214,10 @@ MemoryAllocatorDump* ProcessMemoryDump::GetOrCreateAllocatorDump( |
MemoryAllocatorDump* ProcessMemoryDump::CreateSharedGlobalAllocatorDump( |
const MemoryAllocatorDumpGuid& guid) { |
+ // Global dumps are disabled in background mode. |
+ if (dump_args_.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND) |
+ return black_hole_mad_.get(); |
+ |
// A shared allocator dump can be shared within a process and the guid could |
// have been created already. |
MemoryAllocatorDump* mad = GetSharedGlobalAllocatorDump(guid); |
@@ -206,6 +232,10 @@ MemoryAllocatorDump* ProcessMemoryDump::CreateSharedGlobalAllocatorDump( |
MemoryAllocatorDump* ProcessMemoryDump::CreateWeakSharedGlobalAllocatorDump( |
const MemoryAllocatorDumpGuid& guid) { |
+ // Global dumps are disabled in background mode. |
+ if (dump_args_.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND) |
+ return black_hole_mad_.get(); |
+ |
MemoryAllocatorDump* mad = GetSharedGlobalAllocatorDump(guid); |
if (mad) |
return mad; |
@@ -328,6 +358,10 @@ void ProcessMemoryDump::AddOwnershipEdge( |
void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, |
const std::string& target_node_name) { |
+ // Do not create new dumps for suballocations in background mode. |
+ if (dump_args_.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND) |
+ return; |
Primiano Tucci (use gerrit)
2016/06/02 20:24:04
+ NOTREACHED
ssid
2016/06/03 01:59:46
Hmm, that needs an ugly fix of checking background
Primiano Tucci (use gerrit)
2016/06/03 16:24:36
Ahh I thought you were not expecting suballocation
|
+ |
std::string child_mad_name = target_node_name + "/__" + source.ToString(); |
MemoryAllocatorDump* target_child_mad = CreateAllocatorDump(child_mad_name); |
AddOwnershipEdge(source, target_child_mad->guid()); |