Index: components/tracing/child_trace_message_filter.cc |
diff --git a/components/tracing/child_trace_message_filter.cc b/components/tracing/child_trace_message_filter.cc |
deleted file mode 100644 |
index 5ba562509ddea1393e6c361665f52b96468ab1d5..0000000000000000000000000000000000000000 |
--- a/components/tracing/child_trace_message_filter.cc |
+++ /dev/null |
@@ -1,299 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/tracing/child_trace_message_filter.h" |
- |
-#include <memory> |
- |
-#include "base/memory/ref_counted_memory.h" |
-#include "base/metrics/statistics_recorder.h" |
-#include "base/trace_event/trace_event.h" |
-#include "components/tracing/child_memory_dump_manager_delegate_impl.h" |
-#include "components/tracing/tracing_messages.h" |
-#include "ipc/ipc_channel.h" |
- |
-using base::trace_event::TraceLog; |
- |
-namespace tracing { |
- |
-namespace { |
- |
-const int kMinTimeBetweenHistogramChangesInSeconds = 10; |
- |
-} // namespace |
- |
-ChildTraceMessageFilter::ChildTraceMessageFilter( |
- base::SingleThreadTaskRunner* ipc_task_runner) |
- : sender_(NULL), |
- ipc_task_runner_(ipc_task_runner), |
- pending_memory_dump_guid_(0) { |
-} |
- |
-void ChildTraceMessageFilter::OnFilterAdded(IPC::Sender* sender) { |
- sender_ = sender; |
- sender_->Send(new TracingHostMsg_ChildSupportsTracing()); |
- ChildMemoryDumpManagerDelegateImpl::GetInstance()->SetChildTraceMessageFilter( |
- this); |
-} |
- |
-void ChildTraceMessageFilter::SetSenderForTesting(IPC::Sender* sender) { |
- sender_ = sender; |
-} |
- |
-void ChildTraceMessageFilter::OnFilterRemoved() { |
- ChildMemoryDumpManagerDelegateImpl::GetInstance()->SetChildTraceMessageFilter( |
- nullptr); |
- sender_ = NULL; |
-} |
- |
-bool ChildTraceMessageFilter::OnMessageReceived(const IPC::Message& message) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(ChildTraceMessageFilter, message) |
- IPC_MESSAGE_HANDLER(TracingMsg_BeginTracing, OnBeginTracing) |
- IPC_MESSAGE_HANDLER(TracingMsg_EndTracing, OnEndTracing) |
- IPC_MESSAGE_HANDLER(TracingMsg_CancelTracing, OnCancelTracing) |
- IPC_MESSAGE_HANDLER(TracingMsg_GetTraceLogStatus, OnGetTraceLogStatus) |
- IPC_MESSAGE_HANDLER(TracingMsg_SetWatchEvent, OnSetWatchEvent) |
- IPC_MESSAGE_HANDLER(TracingMsg_CancelWatchEvent, OnCancelWatchEvent) |
- 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) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
-} |
- |
-ChildTraceMessageFilter::~ChildTraceMessageFilter() {} |
- |
-void ChildTraceMessageFilter::OnBeginTracing( |
- const std::string& trace_config_str, |
- base::TimeTicks browser_time, |
- uint64_t tracing_process_id) { |
-#if defined(__native_client__) |
- // NaCl and system times are offset by a bit, so subtract some time from |
- // the captured timestamps. The value might be off by a bit due to messaging |
- // latency. |
- base::TimeDelta time_offset = base::TimeTicks::Now() - browser_time; |
- TraceLog::GetInstance()->SetTimeOffset(time_offset); |
-#endif |
- 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); |
-} |
- |
-void ChildTraceMessageFilter::OnEndTracing() { |
- TraceLog::GetInstance()->SetDisabled(); |
- |
- // Flush will generate one or more callbacks to OnTraceDataCollected |
- // synchronously or asynchronously. EndTracingAck will be sent in the last |
- // OnTraceDataCollected. We are already on the IO thread, so the |
- // OnTraceDataCollected calls will not be deferred. |
- TraceLog::GetInstance()->Flush( |
- base::Bind(&ChildTraceMessageFilter::OnTraceDataCollected, this)); |
- |
- ChildMemoryDumpManagerDelegateImpl::GetInstance()->set_tracing_process_id( |
- base::trace_event::MemoryDumpManager::kInvalidTracingProcessId); |
-} |
- |
-void ChildTraceMessageFilter::OnCancelTracing() { |
- TraceLog::GetInstance()->CancelTracing( |
- base::Bind(&ChildTraceMessageFilter::OnTraceDataCollected, this)); |
-} |
- |
-void ChildTraceMessageFilter::OnGetTraceLogStatus() { |
- sender_->Send(new TracingHostMsg_TraceLogStatusReply( |
- TraceLog::GetInstance()->GetStatus())); |
-} |
- |
-void ChildTraceMessageFilter::OnSetWatchEvent(const std::string& category_name, |
- const std::string& event_name) { |
- TraceLog::GetInstance()->SetWatchEvent( |
- category_name, event_name, |
- base::Bind(&ChildTraceMessageFilter::OnWatchEventMatched, this)); |
-} |
- |
-void ChildTraceMessageFilter::OnCancelWatchEvent() { |
- TraceLog::GetInstance()->CancelWatchEvent(); |
-} |
- |
-void ChildTraceMessageFilter::OnWatchEventMatched() { |
- if (!ipc_task_runner_->BelongsToCurrentThread()) { |
- ipc_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&ChildTraceMessageFilter::OnWatchEventMatched, this)); |
- return; |
- } |
- sender_->Send(new TracingHostMsg_WatchEventMatched); |
-} |
- |
-void ChildTraceMessageFilter::OnTraceDataCollected( |
- const scoped_refptr<base::RefCountedString>& events_str_ptr, |
- bool has_more_events) { |
- if (!ipc_task_runner_->BelongsToCurrentThread()) { |
- ipc_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&ChildTraceMessageFilter::OnTraceDataCollected, |
- this, events_str_ptr, has_more_events)); |
- return; |
- } |
- if (events_str_ptr->data().size()) { |
- sender_->Send(new TracingHostMsg_TraceDataCollected( |
- events_str_ptr->data())); |
- } |
- if (!has_more_events) { |
- std::vector<std::string> category_groups; |
- 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( |
- const std::string& histogram_name, |
- base::Histogram::Sample reference_lower_value, |
- base::Histogram::Sample reference_upper_value, |
- bool repeat, |
- base::Histogram::Sample actual_value) { |
- if (actual_value < reference_lower_value || |
- actual_value > reference_upper_value) { |
- if (!repeat) { |
- ipc_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind( |
- &ChildTraceMessageFilter::SendAbortBackgroundTracingMessage, |
- this)); |
- } |
- } |
- |
- ipc_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&ChildTraceMessageFilter::SendTriggerMessage, this, |
- histogram_name)); |
-} |
- |
-void ChildTraceMessageFilter::SendTriggerMessage( |
- const std::string& histogram_name) { |
- if (!histogram_last_changed_.is_null()) { |
- base::Time computed_next_allowed_time = |
- histogram_last_changed_ + |
- base::TimeDelta::FromSeconds(kMinTimeBetweenHistogramChangesInSeconds); |
- if (computed_next_allowed_time > base::Time::Now()) |
- return; |
- } |
- histogram_last_changed_ = base::Time::Now(); |
- |
- if (sender_) |
- sender_->Send(new TracingHostMsg_TriggerBackgroundTrace(histogram_name)); |
-} |
- |
-void ChildTraceMessageFilter::SendAbortBackgroundTracingMessage() { |
- if (sender_) |
- sender_->Send(new TracingHostMsg_AbortBackgroundTrace()); |
-} |
- |
-void ChildTraceMessageFilter::OnSetUMACallback( |
- const std::string& histogram_name, |
- int histogram_lower_value, |
- int histogram_upper_value, |
- bool repeat) { |
- histogram_last_changed_ = base::Time(); |
- base::StatisticsRecorder::SetCallback( |
- histogram_name, base::Bind(&ChildTraceMessageFilter::OnHistogramChanged, |
- this, histogram_name, histogram_lower_value, |
- histogram_upper_value, repeat)); |
- |
- base::HistogramBase* existing_histogram = |
- base::StatisticsRecorder::FindHistogram(histogram_name); |
- if (!existing_histogram) |
- return; |
- |
- std::unique_ptr<base::HistogramSamples> samples = |
- existing_histogram->SnapshotSamples(); |
- if (!samples) |
- return; |
- |
- std::unique_ptr<base::SampleCountIterator> sample_iterator = |
- samples->Iterator(); |
- if (!sample_iterator) |
- return; |
- |
- while (!sample_iterator->Done()) { |
- base::HistogramBase::Sample min; |
- base::HistogramBase::Sample max; |
- base::HistogramBase::Count count; |
- sample_iterator->Get(&min, &max, &count); |
- |
- if (min >= histogram_lower_value && max <= histogram_upper_value) { |
- ipc_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&ChildTraceMessageFilter::SendTriggerMessage, |
- this, histogram_name)); |
- break; |
- } else if (!repeat) { |
- ipc_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind( |
- &ChildTraceMessageFilter::SendAbortBackgroundTracingMessage, |
- this)); |
- break; |
- } |
- |
- sample_iterator->Next(); |
- } |
-} |
- |
-void ChildTraceMessageFilter::OnClearUMACallback( |
- const std::string& histogram_name) { |
- histogram_last_changed_ = base::Time(); |
- base::StatisticsRecorder::ClearCallback(histogram_name); |
-} |
- |
-} // namespace tracing |