| 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 7523e833cf26cdee9d3843b04668b4ca92474867..dd153403be6538cb641652c3d35743af7639c145 100644
|
| --- a/content/browser/tracing/tracing_controller_impl.cc
|
| +++ b/content/browser/tracing/tracing_controller_impl.cc
|
| @@ -1,7 +1,6 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2013 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 "content/browser/tracing/tracing_controller_impl.h"
|
|
|
| #include "base/bind.h"
|
| @@ -20,6 +19,10 @@
|
| #include "chromeos/dbus/debug_daemon_client.h"
|
| #endif
|
|
|
| +#if defined(OS_WIN)
|
| +#include "content/browser/tracing/etw_system_event_consumer_win.h"
|
| +#endif
|
| +
|
| using base::debug::TraceLog;
|
|
|
| namespace content {
|
| @@ -101,7 +104,7 @@ void TracingControllerImpl::ResultFile::WriteTask(
|
| if (!file_ || !events_str_ptr->data().size())
|
| return;
|
|
|
| - // If there is already a result in the file, then put a commma
|
| + // If there is already a result in the file, then put a comma
|
| // before the next batch of results.
|
| if (has_at_least_one_result_) {
|
| size_t written = fwrite(",", 1, 1, file_);
|
| @@ -129,9 +132,15 @@ void TracingControllerImpl::ResultFile::CloseTask(
|
| DCHECK(written == 1);
|
|
|
| if (system_trace_) {
|
| +#if defined(OS_WIN)
|
| + // The Windows kernel events are kept into a JSon format stored as string
|
| + // and must not be escaped.
|
| + std::string json_string = system_trace_->data();
|
| +#else
|
| std::string json_string = base::GetQuotedJSONString(system_trace_->data());
|
| +#endif
|
|
|
| - const char* systemTraceHead = ", \"systemTraceEvents\": ";
|
| + const char* systemTraceHead = ",\n\"systemTraceEvents\": ";
|
| written = fwrite(systemTraceHead, strlen(systemTraceHead), 1, file_);
|
| DCHECK(written == 1);
|
|
|
| @@ -158,7 +167,7 @@ TracingControllerImpl::TracingControllerImpl() :
|
| maximum_trace_buffer_percent_full_(0),
|
| // Tracing may have been enabled by ContentMainRunner if kTraceStartup
|
| // is specified in command line.
|
| -#if defined(OS_CHROMEOS)
|
| +#if defined(OS_CHROMEOS) || defined(OS_WIN)
|
| is_system_tracing_(false),
|
| #endif
|
| is_recording_(TraceLog::GetInstance()->IsEnabled()),
|
| @@ -234,21 +243,27 @@ bool TracingControllerImpl::EnableRecording(
|
| int trace_options = (options & RECORD_CONTINUOUSLY) ?
|
| TraceLog::RECORD_CONTINUOUSLY : TraceLog::RECORD_UNTIL_FULL;
|
| if (options & ENABLE_SAMPLING) {
|
| - trace_options |= TraceLog::ENABLE_SAMPLING;
|
| + trace_options |= TraceLog::ENABLE_SAMPLING;
|
| }
|
| -#if defined(OS_CHROMEOS)
|
| +
|
| if (options & ENABLE_SYSTRACE) {
|
| +#if defined(OS_CHROMEOS)
|
| DCHECK(!is_system_tracing_);
|
| chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->
|
| StartSystemTracing();
|
| is_system_tracing_ = true;
|
| - }
|
| +#elif defined(OS_WIN)
|
| + DCHECK(!is_system_tracing_);
|
| + is_system_tracing_ =
|
| + EtwSystemEventConsumer::GetInstance()->StartSystemTracing();
|
| #endif
|
| + }
|
| +
|
|
|
| base::Closure on_enable_recording_done_callback =
|
| base::Bind(&TracingControllerImpl::OnEnableRecordingDone,
|
| base::Unretained(this),
|
| - category_filter,trace_options, callback);
|
| + category_filter, trace_options, callback);
|
| BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| base::Bind(&TracingControllerImpl::SetEnabledOnFileThread,
|
| base::Unretained(this),
|
| @@ -425,7 +440,7 @@ void TracingControllerImpl::GetMonitoringStatus(
|
| TracingController::Options* out_options) {
|
| *out_enabled = is_monitoring_;
|
| *out_category_filter =
|
| - TraceLog::GetInstance()->GetCurrentCategoryFilter().ToString();
|
| + TraceLog::GetInstance()->GetCurrentCategoryFilter().ToString();
|
| *out_options = options_;
|
| }
|
|
|
| @@ -668,19 +683,33 @@ void TracingControllerImpl::OnDisableRecordingComplete() {
|
|
|
| #if defined(OS_CHROMEOS)
|
| if (is_system_tracing_) {
|
| + // Disable system tracing.
|
| + is_system_tracing_ = false;
|
| +
|
| // Disable system tracing now that the local trace has shutdown.
|
| // This must be done last because we potentially need to push event
|
| // records into the system event log for synchronizing system event
|
| // timestamps with chrome event timestamps--and since the system event
|
| // log is a ring-buffer (on linux) adding them at the end is the only
|
| // way we're confident we'll have them in the final result.
|
| - is_system_tracing_ = false;
|
| chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->
|
| RequestStopSystemTracing(
|
| base::Bind(&TracingControllerImpl::OnEndSystemTracingAcked,
|
| base::Unretained(this)));
|
| return;
|
| }
|
| +#elif defined(OS_WIN)
|
| + if (is_system_tracing_) {
|
| + // Disable system tracing.
|
| + is_system_tracing_ = false;
|
| +
|
| +
|
| + // Stop kernel tracing and flush events.
|
| + EtwSystemEventConsumer::GetInstance()->StopSystemTracing(
|
| + base::Bind(&TracingControllerImpl::OnEndSystemTracingAcked,
|
| + base::Unretained(this)));
|
| + return;
|
| + }
|
| #endif
|
|
|
| // Trigger callback if one is set.
|
| @@ -707,7 +736,7 @@ void TracingControllerImpl::OnResultFileClosed() {
|
| result_file_.reset();
|
| }
|
|
|
| -#if defined(OS_CHROMEOS)
|
| +#if defined(OS_CHROMEOS) || defined(OS_WIN)
|
| void TracingControllerImpl::OnEndSystemTracingAcked(
|
| const scoped_refptr<base::RefCountedString>& events_str_ptr) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -873,21 +902,18 @@ void TracingControllerImpl::OnWatchEventMatched() {
|
| watch_event_callback_.Run();
|
| }
|
|
|
| -void TracingControllerImpl::RegisterTracingUI(TracingUI* tracing_ui)
|
| -{
|
| +void TracingControllerImpl::RegisterTracingUI(TracingUI* tracing_ui) {
|
| DCHECK(tracing_uis_.find(tracing_ui) == tracing_uis_.end());
|
| tracing_uis_.insert(tracing_ui);
|
| }
|
|
|
| -void TracingControllerImpl::UnregisterTracingUI(TracingUI* tracing_ui)
|
| -{
|
| +void TracingControllerImpl::UnregisterTracingUI(TracingUI* tracing_ui) {
|
| std::set<TracingUI*>::iterator it = tracing_uis_.find(tracing_ui);
|
| DCHECK(it != tracing_uis_.end());
|
| tracing_uis_.erase(it);
|
| }
|
|
|
| -void TracingControllerImpl::OnMonitoringStateChanged(bool is_monitoring)
|
| -{
|
| +void TracingControllerImpl::OnMonitoringStateChanged(bool is_monitoring) {
|
| if (is_monitoring_ == is_monitoring)
|
| return;
|
|
|
|
|