| Index: components/tracing/child/child_trace_message_filter.cc
|
| diff --git a/components/tracing/child/child_trace_message_filter.cc b/components/tracing/child/child_trace_message_filter.cc
|
| index 6012a96a8f4291afecf2278757e9c16cde8d9ec2..ed2be875c7da066e73b97ee3e044e14f61b5c68d 100644
|
| --- a/components/tracing/child/child_trace_message_filter.cc
|
| +++ b/components/tracing/child/child_trace_message_filter.cc
|
| @@ -8,13 +8,11 @@
|
|
|
| #include "base/memory/ref_counted_memory.h"
|
| #include "base/metrics/statistics_recorder.h"
|
| -#include "base/trace_event/memory_dump_manager.h"
|
| #include "base/trace_event/trace_event.h"
|
| -#include "components/tracing/common/process_metrics_memory_dump_provider.h"
|
| +#include "components/tracing/child/child_memory_dump_manager_delegate_impl.h"
|
| #include "components/tracing/common/tracing_messages.h"
|
| #include "ipc/ipc_channel.h"
|
|
|
| -using base::trace_event::MemoryDumpManager;
|
| using base::trace_event::TraceLog;
|
|
|
| namespace tracing {
|
| @@ -27,18 +25,16 @@
|
|
|
| ChildTraceMessageFilter::ChildTraceMessageFilter(
|
| base::SingleThreadTaskRunner* ipc_task_runner)
|
| - : sender_(NULL), ipc_task_runner_(ipc_task_runner) {}
|
| + : sender_(NULL),
|
| + ipc_task_runner_(ipc_task_runner),
|
| + pending_memory_dump_guid_(0) {
|
| +}
|
|
|
| void ChildTraceMessageFilter::OnFilterAdded(IPC::Channel* channel) {
|
| sender_ = channel;
|
| sender_->Send(new TracingHostMsg_ChildSupportsTracing());
|
| -
|
| -#if !defined(OS_LINUX) && !defined(OS_NACL)
|
| - // On linux the browser process takes care of dumping process metrics.
|
| - // The child process is not allowed to do so due to BPF sandbox.
|
| - tracing::ProcessMetricsMemoryDumpProvider::RegisterForProcess(
|
| - base::kNullProcessId);
|
| -#endif
|
| + ChildMemoryDumpManagerDelegateImpl::GetInstance()->SetChildTraceMessageFilter(
|
| + this);
|
| }
|
|
|
| void ChildTraceMessageFilter::SetSenderForTesting(IPC::Sender* sender) {
|
| @@ -46,6 +42,8 @@
|
| }
|
|
|
| void ChildTraceMessageFilter::OnFilterRemoved() {
|
| + ChildMemoryDumpManagerDelegateImpl::GetInstance()->SetChildTraceMessageFilter(
|
| + nullptr);
|
| sender_ = NULL;
|
| }
|
|
|
| @@ -56,6 +54,10 @@
|
| IPC_MESSAGE_HANDLER(TracingMsg_EndTracing, OnEndTracing)
|
| IPC_MESSAGE_HANDLER(TracingMsg_CancelTracing, OnCancelTracing)
|
| IPC_MESSAGE_HANDLER(TracingMsg_GetTraceLogStatus, OnGetTraceLogStatus)
|
| + IPC_MESSAGE_HANDLER(TracingMsg_ProcessMemoryDumpRequest,
|
| + OnProcessMemoryDumpRequest)
|
| + IPC_MESSAGE_HANDLER(TracingMsg_GlobalMemoryDumpResponse,
|
| + OnGlobalMemoryDumpResponse)
|
| IPC_MESSAGE_HANDLER(TracingMsg_SetUMACallback, OnSetUMACallback)
|
| IPC_MESSAGE_HANDLER(TracingMsg_ClearUMACallback, OnClearUMACallback)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| @@ -76,7 +78,8 @@
|
| base::TimeDelta time_offset = base::TimeTicks::Now() - browser_time;
|
| TraceLog::GetInstance()->SetTimeOffset(time_offset);
|
| #endif
|
| - MemoryDumpManager::GetInstance()->set_tracing_process_id(tracing_process_id);
|
| + ChildMemoryDumpManagerDelegateImpl::GetInstance()->set_tracing_process_id(
|
| + tracing_process_id);
|
| TraceLog::GetInstance()->SetEnabled(
|
| base::trace_event::TraceConfig(trace_config_str),
|
| base::trace_event::TraceLog::RECORDING_MODE);
|
| @@ -92,8 +95,8 @@
|
| TraceLog::GetInstance()->Flush(
|
| base::Bind(&ChildTraceMessageFilter::OnTraceDataCollected, this));
|
|
|
| - MemoryDumpManager::GetInstance()->set_tracing_process_id(
|
| - MemoryDumpManager::kInvalidTracingProcessId);
|
| + ChildMemoryDumpManagerDelegateImpl::GetInstance()->set_tracing_process_id(
|
| + base::trace_event::MemoryDumpManager::kInvalidTracingProcessId);
|
| }
|
|
|
| void ChildTraceMessageFilter::OnCancelTracing() {
|
| @@ -124,6 +127,52 @@
|
| TraceLog::GetInstance()->GetKnownCategoryGroups(&category_groups);
|
| sender_->Send(new TracingHostMsg_EndTracingAck(category_groups));
|
| }
|
| +}
|
| +
|
| +// Sent by the Browser's MemoryDumpManager when coordinating a global dump.
|
| +void ChildTraceMessageFilter::OnProcessMemoryDumpRequest(
|
| + const base::trace_event::MemoryDumpRequestArgs& args) {
|
| + ChildMemoryDumpManagerDelegateImpl::GetInstance()->CreateProcessDump(
|
| + args,
|
| + base::Bind(&ChildTraceMessageFilter::OnProcessMemoryDumpDone, this));
|
| +}
|
| +
|
| +void ChildTraceMessageFilter::OnProcessMemoryDumpDone(uint64_t dump_guid,
|
| + bool success) {
|
| + sender_->Send(
|
| + new TracingHostMsg_ProcessMemoryDumpResponse(dump_guid, success));
|
| +}
|
| +
|
| +// Initiates a dump request, asking the Browser's MemoryDumpManager to
|
| +// coordinate a global memory dump. The Browser's MDM will answer back with a
|
| +// MemoryDumpResponse when all the child processes (including this one) have
|
| +// dumped, or with a NACK (|success| == false) if the dump failed (e.g., due to
|
| +// a collision with a concurrent request from another child process).
|
| +void ChildTraceMessageFilter::SendGlobalMemoryDumpRequest(
|
| + const base::trace_event::MemoryDumpRequestArgs& args,
|
| + const base::trace_event::MemoryDumpCallback& callback) {
|
| + // If there is already another dump request pending from this child process,
|
| + // there is no point bothering the Browser's MemoryDumpManager.
|
| + if (pending_memory_dump_guid_) {
|
| + if (!callback.is_null())
|
| + callback.Run(args.dump_guid, false);
|
| + return;
|
| + }
|
| +
|
| + pending_memory_dump_guid_ = args.dump_guid;
|
| + pending_memory_dump_callback_ = callback;
|
| + sender_->Send(new TracingHostMsg_GlobalMemoryDumpRequest(args));
|
| +}
|
| +
|
| +// Sent by the Browser's MemoryDumpManager in response of a dump request
|
| +// initiated by this child process.
|
| +void ChildTraceMessageFilter::OnGlobalMemoryDumpResponse(uint64_t dump_guid,
|
| + bool success) {
|
| + DCHECK_NE(0U, pending_memory_dump_guid_);
|
| + pending_memory_dump_guid_ = 0;
|
| + if (pending_memory_dump_callback_.is_null())
|
| + return;
|
| + pending_memory_dump_callback_.Run(dump_guid, success);
|
| }
|
|
|
| void ChildTraceMessageFilter::OnHistogramChanged(
|
|
|