| Index: trunk/src/content/browser/tracing/tracing_controller_impl.cc
|
| ===================================================================
|
| --- trunk/src/content/browser/tracing/tracing_controller_impl.cc (revision 237451)
|
| +++ trunk/src/content/browser/tracing/tracing_controller_impl.cc (working copy)
|
| @@ -5,7 +5,6 @@
|
| #include "content/browser/tracing/tracing_controller_impl.h"
|
|
|
| #include "base/bind.h"
|
| -#include "base/debug/trace_event.h"
|
| #include "base/file_util.h"
|
| #include "base/json/string_escape.h"
|
| #include "base/strings/string_number_conversions.h"
|
| @@ -119,7 +118,9 @@
|
| // Tracing may have been enabled by ContentMainRunner if kTraceStartup
|
| // is specified in command line.
|
| is_recording_(TraceLog::GetInstance()->IsEnabled()),
|
| - is_monitoring_(false) {
|
| + is_monitoring_(false),
|
| + category_filter_(
|
| + base::debug::CategoryFilter::kDefaultCategoryFilterString) {
|
| }
|
|
|
| TracingControllerImpl::~TracingControllerImpl() {
|
| @@ -131,7 +132,7 @@
|
| return g_controller.Pointer();
|
| }
|
|
|
| -bool TracingControllerImpl::GetCategories(
|
| +void TracingControllerImpl::GetCategories(
|
| const GetCategoriesDoneCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| @@ -139,19 +140,14 @@
|
| // message. So to get known categories, just begin and end tracing immediately
|
| // afterwards. This will ping all the child processes for categories.
|
| pending_get_categories_done_callback_ = callback;
|
| - if (!EnableRecording("*", TracingController::Options(),
|
| - EnableRecordingDoneCallback())) {
|
| - pending_get_categories_done_callback_.Reset();
|
| - return false;
|
| - }
|
| -
|
| - bool ok = DisableRecording(base::FilePath(), TracingFileResultCallback());
|
| - DCHECK(ok);
|
| - return true;
|
| + EnableRecording(base::debug::CategoryFilter("*"),
|
| + TracingController::Options(),
|
| + EnableRecordingDoneCallback());
|
| + DisableRecording(base::FilePath(), TracingFileResultCallback());
|
| }
|
|
|
| bool TracingControllerImpl::EnableRecording(
|
| - const std::string& category_filter,
|
| + const base::debug::CategoryFilter& filter,
|
| TracingController::Options options,
|
| const EnableRecordingDoneCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -172,14 +168,13 @@
|
| }
|
| // TODO(haraken): How to handle ENABLE_SYSTRACE?
|
|
|
| - TraceLog::GetInstance()->SetEnabled(
|
| - base::debug::CategoryFilter(category_filter), trace_options);
|
| + TraceLog::GetInstance()->SetEnabled(filter, trace_options);
|
| is_recording_ = true;
|
| + category_filter_ = TraceLog::GetInstance()->GetCurrentCategoryFilter();
|
|
|
| // Notify all child processes.
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| - it->get()->SendBeginTracing(category_filter, trace_options);
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| + it->get()->SendBeginTracing(category_filter_.ToString(), trace_options);
|
| }
|
|
|
| if (!callback.is_null())
|
| @@ -209,13 +204,15 @@
|
| if (!callback.is_null() || !result_file_path.empty())
|
| result_file_.reset(new ResultFile(result_file_path));
|
|
|
| + // There could be a case where there are no child processes and filters_
|
| + // is empty. In that case we can immediately tell the subscriber that tracing
|
| + // has ended. To avoid recursive calls back to the subscriber, we will just
|
| + // use the existing asynchronous OnDisableRecordingAcked code.
|
| // Count myself (local trace) in pending_disable_recording_ack_count_,
|
| // acked below.
|
| - pending_disable_recording_ack_count_ = trace_message_filters_.size() + 1;
|
| + pending_disable_recording_ack_count_ = filters_.size() + 1;
|
|
|
| - // Handle special case of zero child processes by immediately telling the
|
| - // caller that tracing has ended. Use asynchronous OnDisableRecordingAcked
|
| - // to avoid recursive call back to the caller.
|
| + // Handle special case of zero child processes.
|
| if (pending_disable_recording_ack_count_ == 1) {
|
| // Ack asynchronously now, because we don't have any children to wait for.
|
| std::vector<std::string> category_groups;
|
| @@ -226,15 +223,14 @@
|
| }
|
|
|
| // Notify all child processes.
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| it->get()->SendEndTracing();
|
| }
|
| return true;
|
| }
|
|
|
| bool TracingControllerImpl::EnableMonitoring(
|
| - const std::string& category_filter,
|
| + const base::debug::CategoryFilter& filter,
|
| TracingController::Options options,
|
| const EnableMonitoringDoneCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -252,14 +248,12 @@
|
| monitoring_tracing_options |= base::debug::TraceLog::MONITOR_SAMPLING;
|
|
|
| TraceLog::GetInstance()->SetEnabled(
|
| - base::debug::CategoryFilter(category_filter),
|
| - static_cast<TraceLog::Options>(monitoring_tracing_options));
|
| + filter, base::debug::TraceLog::Options(monitoring_tracing_options));
|
|
|
| // Notify all child processes.
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| - it->get()->SendEnableMonitoring(category_filter,
|
| - static_cast<TraceLog::Options>(monitoring_tracing_options));
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| + it->get()->SendEnableMonitoring(filter.ToString(),
|
| + base::debug::TraceLog::Options(monitoring_tracing_options));
|
| }
|
|
|
| if (!callback.is_null())
|
| @@ -278,8 +272,7 @@
|
| TraceLog::GetInstance()->SetDisabled();
|
|
|
| // Notify all child processes.
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| it->get()->SendDisableMonitoring();
|
| }
|
|
|
| @@ -290,34 +283,34 @@
|
|
|
| void TracingControllerImpl::GetMonitoringStatus(
|
| bool* out_enabled,
|
| - std::string* out_category_filter,
|
| + base::debug::CategoryFilter* out_filter,
|
| TracingController::Options* out_options) {
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| -bool TracingControllerImpl::CaptureMonitoringSnapshot(
|
| +void TracingControllerImpl::CaptureMonitoringSnapshot(
|
| const base::FilePath& result_file_path,
|
| const TracingFileResultCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| if (!can_disable_monitoring())
|
| - return false;
|
| + return;
|
|
|
| if (callback.is_null() && result_file_path.empty())
|
| - return false;
|
| + return;
|
|
|
| pending_capture_monitoring_snapshot_done_callback_ = callback;
|
| monitoring_snapshot_file_.reset(new ResultFile(result_file_path));
|
|
|
| + // There could be a case where there are no child processes and filters_
|
| + // is empty. In that case we can immediately tell the subscriber that tracing
|
| + // has ended. To avoid recursive calls back to the subscriber, we will just
|
| + // use the existing asynchronous OnCaptureMonitoringSnapshotAcked code.
|
| // Count myself in pending_capture_monitoring_snapshot_ack_count_,
|
| // acked below.
|
| - pending_capture_monitoring_snapshot_ack_count_ =
|
| - trace_message_filters_.size() + 1;
|
| + pending_capture_monitoring_snapshot_ack_count_ = filters_.size() + 1;
|
|
|
| - // Handle special case of zero child processes by immediately telling the
|
| - // caller that capturing snapshot has ended. Use asynchronous
|
| - // OnCaptureMonitoringSnapshotAcked to avoid recursive call back to the
|
| - // caller.
|
| + // Handle special case of zero child processes.
|
| if (pending_capture_monitoring_snapshot_ack_count_ == 1) {
|
| // Ack asynchronously now, because we don't have any children to wait for.
|
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| @@ -326,16 +319,13 @@
|
| }
|
|
|
| // Notify all child processes.
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| it->get()->SendCaptureMonitoringSnapshot();
|
| }
|
|
|
| #if defined(OS_ANDROID)
|
| TraceLog::GetInstance()->AddClockSyncMetadataEvent();
|
| #endif
|
| -
|
| - return true;
|
| }
|
|
|
| bool TracingControllerImpl::GetTraceBufferPercentFull(
|
| @@ -348,8 +338,7 @@
|
| pending_trace_buffer_percent_full_callback_ = callback;
|
|
|
| // Count myself in pending_trace_buffer_percent_full_ack_count_, acked below.
|
| - pending_trace_buffer_percent_full_ack_count_ =
|
| - trace_message_filters_.size() + 1;
|
| + pending_trace_buffer_percent_full_ack_count_ = filters_.size() + 1;
|
| maximum_trace_buffer_percent_full_ = 0;
|
|
|
| // Handle special case of zero child processes.
|
| @@ -361,86 +350,36 @@
|
| }
|
|
|
| // Notify all child processes.
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| it->get()->SendGetTraceBufferPercentFull();
|
| }
|
| return true;
|
| }
|
|
|
| -bool TracingControllerImpl::SetWatchEvent(
|
| - const std::string& category_name,
|
| - const std::string& event_name,
|
| - const WatchEventCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (callback.is_null())
|
| - return false;
|
| -
|
| - watch_category_name_ = category_name;
|
| - watch_event_name_ = event_name;
|
| - watch_event_callback_ = callback;
|
| -
|
| - TraceLog::GetInstance()->SetWatchEvent(
|
| - category_name, event_name,
|
| - base::Bind(&TracingControllerImpl::OnWatchEventMatched,
|
| - base::Unretained(this)));
|
| -
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| - it->get()->SendSetWatchEvent(category_name, event_name);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool TracingControllerImpl::CancelWatchEvent() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (!can_cancel_watch_event())
|
| - return false;
|
| -
|
| - for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin();
|
| - it != trace_message_filters_.end(); ++it) {
|
| - it->get()->SendCancelWatchEvent();
|
| - }
|
| -
|
| - watch_event_callback_.Reset();
|
| - return true;
|
| -}
|
| -
|
| -void TracingControllerImpl::AddTraceMessageFilter(
|
| - TraceMessageFilter* trace_message_filter) {
|
| +void TracingControllerImpl::AddFilter(TraceMessageFilter* filter) {
|
| if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&TracingControllerImpl::AddTraceMessageFilter,
|
| - base::Unretained(this),
|
| - make_scoped_refptr(trace_message_filter)));
|
| + base::Bind(&TracingControllerImpl::AddFilter, base::Unretained(this),
|
| + make_scoped_refptr(filter)));
|
| return;
|
| }
|
|
|
| - trace_message_filters_.insert(trace_message_filter);
|
| - if (can_cancel_watch_event()) {
|
| - trace_message_filter->SendSetWatchEvent(watch_category_name_,
|
| - watch_event_name_);
|
| - }
|
| + filters_.insert(filter);
|
| if (can_disable_recording()) {
|
| - trace_message_filter->SendBeginTracing(
|
| - TraceLog::GetInstance()->GetCurrentCategoryFilter().ToString(),
|
| - TraceLog::GetInstance()->trace_options());
|
| + std::string cf_str = category_filter_.ToString();
|
| + filter->SendBeginTracing(cf_str, TraceLog::GetInstance()->trace_options());
|
| }
|
| }
|
|
|
| -void TracingControllerImpl::RemoveTraceMessageFilter(
|
| - TraceMessageFilter* trace_message_filter) {
|
| +void TracingControllerImpl::RemoveFilter(TraceMessageFilter* filter) {
|
| if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&TracingControllerImpl::RemoveTraceMessageFilter,
|
| - base::Unretained(this),
|
| - make_scoped_refptr(trace_message_filter)));
|
| + base::Bind(&TracingControllerImpl::RemoveFilter, base::Unretained(this),
|
| + make_scoped_refptr(filter)));
|
| return;
|
| }
|
|
|
| - trace_message_filters_.erase(trace_message_filter);
|
| + filters_.erase(filter);
|
| }
|
|
|
| void TracingControllerImpl::OnDisableRecordingAcked(
|
| @@ -630,15 +569,4 @@
|
| }
|
| }
|
|
|
| -void TracingControllerImpl::OnWatchEventMatched() {
|
| - if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&TracingControllerImpl::OnWatchEventMatched,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - if (!watch_event_callback_.is_null())
|
| - watch_event_callback_.Run();
|
| -}
|
| -
|
| } // namespace content
|
|
|