Commit caffa0a0 authored by Nate Fischer's avatar Nate Fischer Committed by Commit Bot

UMA: workaround null MemoryInstrumentation

It appears the MemoryInstrumentation singleton can be null in UMA
logging code, possibly because this runs prior to //content
initialization. There's no memory metrics to log in this case, so we
work around this by null-checking the singleton and exiting early.

Fixed: 1140173
Test: None
Change-Id: Id5e783dd068381dac1d7ac48b86764acc54ed620
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2533738
Commit-Queue: Nate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarRobert Kaplow <rkaplow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827121}
parent f3505498
...@@ -649,6 +649,11 @@ void ProcessMemoryMetricsEmitter::FetchAndEmitProcessMemoryMetrics() { ...@@ -649,6 +649,11 @@ void ProcessMemoryMetricsEmitter::FetchAndEmitProcessMemoryMetrics() {
MarkServiceRequestsInProgress(); MarkServiceRequestsInProgress();
auto* instrumentation =
memory_instrumentation::MemoryInstrumentation::GetInstance();
// nullptr means content layer is not initialized yet (there's no memory
// metrics to log in this case)
if (instrumentation) {
// The callback keeps this object alive until the callback is invoked. // The callback keeps this object alive until the callback is invoked.
auto callback = auto callback =
base::BindOnce(&ProcessMemoryMetricsEmitter::ReceivedMemoryDump, this); base::BindOnce(&ProcessMemoryMetricsEmitter::ReceivedMemoryDump, this);
...@@ -656,11 +661,11 @@ void ProcessMemoryMetricsEmitter::FetchAndEmitProcessMemoryMetrics() { ...@@ -656,11 +661,11 @@ void ProcessMemoryMetricsEmitter::FetchAndEmitProcessMemoryMetrics() {
for (const auto& metric : kAllocatorDumpNamesForMetrics) for (const auto& metric : kAllocatorDumpNamesForMetrics)
mad_list.push_back(metric.dump_name); mad_list.push_back(metric.dump_name);
if (pid_scope_ != base::kNullProcessId) { if (pid_scope_ != base::kNullProcessId) {
memory_instrumentation::MemoryInstrumentation::GetInstance() instrumentation->RequestGlobalDumpForPid(pid_scope_, mad_list,
->RequestGlobalDumpForPid(pid_scope_, mad_list, std::move(callback)); std::move(callback));
} else { } else {
memory_instrumentation::MemoryInstrumentation::GetInstance() instrumentation->RequestGlobalDump(mad_list, std::move(callback));
->RequestGlobalDump(mad_list, std::move(callback)); }
} }
// Use a lambda adapter to post the results back to this sequence. // Use a lambda adapter to post the results back to this sequence.
......
...@@ -143,9 +143,14 @@ void MemoryMetricsLogger::RecordMemoryMetricsAfterDelay( ...@@ -143,9 +143,14 @@ void MemoryMetricsLogger::RecordMemoryMetricsAfterDelay(
// static // static
void MemoryMetricsLogger::RecordMemoryMetrics(scoped_refptr<State> state, void MemoryMetricsLogger::RecordMemoryMetrics(scoped_refptr<State> state,
RecordCallback done_callback) { RecordCallback done_callback) {
memory_instrumentation::MemoryInstrumentation::GetInstance() auto* instrumentation =
->RequestGlobalDump({}, base::BindOnce(&RecordMemoryMetricsImpl, memory_instrumentation::MemoryInstrumentation::GetInstance();
std::move(done_callback))); if (!instrumentation) {
// Content layer is not initialized yet, nothing to log.
return;
}
instrumentation->RequestGlobalDump(
{}, base::BindOnce(&RecordMemoryMetricsImpl, std::move(done_callback)));
RecordMemoryMetricsAfterDelay(state); RecordMemoryMetricsAfterDelay(state);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment