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,18 +649,23 @@ void ProcessMemoryMetricsEmitter::FetchAndEmitProcessMemoryMetrics() {
MarkServiceRequestsInProgress();
// The callback keeps this object alive until the callback is invoked.
auto callback =
base::BindOnce(&ProcessMemoryMetricsEmitter::ReceivedMemoryDump, this);
std::vector<std::string> mad_list;
for (const auto& metric : kAllocatorDumpNamesForMetrics)
mad_list.push_back(metric.dump_name);
if (pid_scope_ != base::kNullProcessId) {
memory_instrumentation::MemoryInstrumentation::GetInstance()
->RequestGlobalDumpForPid(pid_scope_, mad_list, std::move(callback));
} else {
memory_instrumentation::MemoryInstrumentation::GetInstance()
->RequestGlobalDump(mad_list, std::move(callback));
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.
auto callback =
base::BindOnce(&ProcessMemoryMetricsEmitter::ReceivedMemoryDump, this);
std::vector<std::string> mad_list;
for (const auto& metric : kAllocatorDumpNamesForMetrics)
mad_list.push_back(metric.dump_name);
if (pid_scope_ != base::kNullProcessId) {
instrumentation->RequestGlobalDumpForPid(pid_scope_, mad_list,
std::move(callback));
} else {
instrumentation->RequestGlobalDump(mad_list, std::move(callback));
}
}
// Use a lambda adapter to post the results back to this sequence.
......
......@@ -143,9 +143,14 @@ void MemoryMetricsLogger::RecordMemoryMetricsAfterDelay(
// static
void MemoryMetricsLogger::RecordMemoryMetrics(scoped_refptr<State> state,
RecordCallback done_callback) {
memory_instrumentation::MemoryInstrumentation::GetInstance()
->RequestGlobalDump({}, base::BindOnce(&RecordMemoryMetricsImpl,
std::move(done_callback)));
auto* instrumentation =
memory_instrumentation::MemoryInstrumentation::GetInstance();
if (!instrumentation) {
// Content layer is not initialized yet, nothing to log.
return;
}
instrumentation->RequestGlobalDump(
{}, base::BindOnce(&RecordMemoryMetricsImpl, std::move(done_callback)));
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