Index: content/browser/tracing/tracing_controller_impl.cc |
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc |
index 3686e85c0a765fe9eb7db5990b372d3f92ea1d5d..d2ed5373847378f2d4615a3a7749045fa0140c90 100644 |
--- a/content/browser/tracing/tracing_controller_impl.cc |
+++ b/content/browser/tracing/tracing_controller_impl.cc |
@@ -3,6 +3,10 @@ |
// found in the LICENSE file. |
#include "content/browser/tracing/tracing_controller_impl.h" |
+#include <algorithm> |
+#include <memory> |
+#include <utility> |
+ |
#include "base/bind.h" |
#include "base/cpu.h" |
#include "base/files/file_util.h" |
@@ -44,6 +48,7 @@ |
#if defined(OS_CHROMEOS) |
#include "chromeos/dbus/dbus_thread_manager.h" |
#include "chromeos/dbus/debug_daemon_client.h" |
+#include "chromeos/trace/arc_trace_agent.h" |
#endif |
#if defined(OS_WIN) |
@@ -62,6 +67,7 @@ base::LazyInstance<TracingControllerImpl>::Leaky g_controller = |
const char kChromeTracingAgentName[] = "chrome"; |
const char kETWTracingAgentName[] = "etw"; |
+const char kArcTracingAgentName[] = "arc"; |
const char kChromeTraceLabel[] = "traceEvents"; |
const int kStartTracingTimeoutSeconds = 30; |
@@ -297,6 +303,17 @@ bool TracingControllerImpl::StartTracing( |
#endif |
} |
+#if defined(OS_CHROMEOS) |
+ auto* arc_trace_agent = chromeos::ArcTraceAgent::GetInstance(); |
+ if (arc_trace_agent) { |
+ arc_trace_agent->StartAgentTracing( |
+ trace_config, |
+ base::Bind(&TracingControllerImpl::OnStartAgentTracingAcked, |
+ base::Unretained(this))); |
+ ++pending_start_tracing_ack_count_; |
+ } |
+#endif |
+ |
// TraceLog may have been enabled in startup tracing before threads are ready. |
if (TraceLog::GetInstance()->IsEnabled()) |
return true; |
@@ -562,6 +579,12 @@ void TracingControllerImpl::AddTracingAgent(const std::string& agent_name) { |
BrowserThread::GetBlockingPool()); |
return; |
} |
+ |
+ auto* arc_trace_agent = chromeos::ArcTraceAgent::GetInstance(); |
+ if (arc_trace_agent && agent_name == arc_trace_agent->GetTracingAgentName()) { |
+ additional_tracing_agents_.push_back(arc_trace_agent); |
+ return; |
+ } |
#elif defined(OS_WIN) |
auto* etw_agent = EtwTracingAgent::GetInstance(); |
if (agent_name == etw_agent->GetTracingAgentName()) { |
@@ -667,14 +690,20 @@ void TracingControllerImpl::OnEndAgentTracingAcked( |
if (trace_data_sink_.get() && events_str_ptr && |
!events_str_ptr->data().empty()) { |
std::string json_string; |
- if (agent_name == kETWTracingAgentName) { |
- // The Windows kernel events are kept into a JSON format stored as string |
- // and must not be escaped. |
+ if (agent_name == kETWTracingAgentName || |
+ agent_name == kArcTracingAgentName) { |
+ // The Windows kernel events and ARC Android tracing event are kept |
+ // into a JSON format stored as string and must not be escaped. |
json_string = events_str_ptr->data(); |
} else { |
json_string = base::GetQuotedJSONString(events_str_ptr->data()); |
} |
- trace_data_sink_->AddAgentTrace(events_label, json_string); |
+ |
+ if (agent_name == kArcTracingAgentName) { |
+ trace_data_sink_->AddTraceChunk(json_string); |
+ } else { |
+ trace_data_sink_->AddAgentTrace(events_label, json_string); |
+ } |
} |
std::vector<std::string> category_groups; |
OnStopTracingAcked(NULL, category_groups); |
@@ -829,7 +858,7 @@ void TracingControllerImpl::RecordClockSyncMarker( |
void TracingControllerImpl::IssueClockSyncMarker() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- DCHECK(pending_clock_sync_ack_count_ == 0); |
+ DCHECK_EQ(0, pending_clock_sync_ack_count_); |
for (auto* it : additional_tracing_agents_) { |
if (it->SupportsExplicitClockSync()) { |
@@ -869,7 +898,7 @@ void TracingControllerImpl::OnClockSyncMarkerRecordedByAgent( |
return; |
// Stop tracing only if all agents report back. |
- if(--pending_clock_sync_ack_count_ == 0) { |
+ if (--pending_clock_sync_ack_count_ == 0) { |
clock_sync_timer_.Stop(); |
StopTracingAfterClockSync(); |
} |