Index: base/trace_event/memory_dump_manager.cc |
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc |
index 32c93f7558e2900ebbaf0c87efe19c3b9e824a20..3df7503165773994c8d5e3162408856d69bc0ebe 100644 |
--- a/base/trace_event/memory_dump_manager.cc |
+++ b/base/trace_event/memory_dump_manager.cc |
@@ -320,10 +320,18 @@ void MemoryDumpManager::RegisterDumpProviderInternal( |
if (dumper_registrations_ignored_for_testing_) |
return; |
+ // A handful of MDPs are required to compute the summary struct these are |
+ // 'whitelisted for summary mode'. These MDPs are a subset of those which |
+ // have small enough performance overhead that it is resonable to run them |
+ // in the background while the user is doing other things. Those MDPs are |
+ // 'whitelisted for background mode'. |
bool whitelisted_for_background_mode = IsMemoryDumpProviderWhitelisted(name); |
- scoped_refptr<MemoryDumpProviderInfo> mdpinfo = |
- new MemoryDumpProviderInfo(mdp, name, std::move(task_runner), options, |
- whitelisted_for_background_mode); |
+ bool whitelisted_for_summary_mode = |
+ IsMemoryDumpProviderWhitelistedForSummary(name); |
+ |
+ scoped_refptr<MemoryDumpProviderInfo> mdpinfo = new MemoryDumpProviderInfo( |
+ mdp, name, std::move(task_runner), options, |
+ whitelisted_for_background_mode, whitelisted_for_summary_mode); |
if (options.is_fast_polling_supported) { |
DCHECK(!mdpinfo->task_runner) << "MemoryDumpProviders capable of fast " |
@@ -563,6 +571,14 @@ void MemoryDumpManager::SetupNextMemoryDump( |
return SetupNextMemoryDump(std::move(pmd_async_state)); |
} |
+ // If we are in summary mode, we only need to invoke the providers |
+ // whitelisted for summary mode. |
+ if (pmd_async_state->req_args.dump_type == MemoryDumpType::SUMMARY_ONLY && |
+ !mdpinfo->whitelisted_for_summary_mode) { |
+ pmd_async_state->pending_dump_providers.pop_back(); |
+ return SetupNextMemoryDump(std::move(pmd_async_state)); |
+ } |
+ |
// If the dump provider did not specify a task runner affinity, dump on |
// |dump_thread_|. |
SequencedTaskRunner* task_runner = mdpinfo->task_runner.get(); |