Chromium Code Reviews| Index: content/browser/tracing/background_tracing_manager_impl.cc |
| diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc |
| index 68392b2c1e9f798b933b288169b672efb173426c..7bb09cc39c50e37320fb4a0f4d36c60281e4d0ab 100644 |
| --- a/content/browser/tracing/background_tracing_manager_impl.cc |
| +++ b/content/browser/tracing/background_tracing_manager_impl.cc |
| @@ -9,6 +9,8 @@ |
| #include "base/metrics/histogram_macros.h" |
| #include "base/metrics/statistics_recorder.h" |
| #include "base/time/time.h" |
| +#include "components/tracing/tracing_messages.h" |
| +#include "content/browser/tracing/trace_message_filter.h" |
| #include "content/public/browser/background_tracing_preemptive_config.h" |
| #include "content/public/browser/background_tracing_reactive_config.h" |
| #include "content/public/browser/browser_thread.h" |
| @@ -87,6 +89,9 @@ BackgroundTracingManagerImpl::BackgroundTracingManagerImpl() |
| is_tracing_(false), |
| requires_anonymized_data_(true), |
| trigger_handle_ids_(0) { |
| + TracingControllerImpl::GetInstance()->SetTraceMessageFilterAddedCallback( |
| + base::Bind(&BackgroundTracingManagerImpl::OnTraceMessageFilterAdded, |
| + base::Unretained(this))); |
|
dcheng
2015/07/27 17:19:58
Personally, I think it's better to annotate uses o
shatch
2015/07/27 19:08:04
Yeah that's fair enough, added some explanation.
|
| } |
| BackgroundTracingManagerImpl::~BackgroundTracingManagerImpl() { |
| @@ -160,38 +165,55 @@ void BackgroundTracingManagerImpl::SetupUMACallbacks( |
| } else { |
| base::StatisticsRecorder::SetCallback( |
| configs[i].histogram_trigger_info.histogram_name, |
| - base::Bind(&BackgroundTracingManagerImpl::OnHistogramChanged, |
| + base::Bind(&BackgroundTracingManagerImpl::OnHistogramChangedCallback, |
| base::Unretained(this), |
| configs[i].histogram_trigger_info.histogram_name, |
| configs[i].histogram_trigger_info.histogram_value)); |
| } |
| } |
| + |
| + SetupFiltersFromConfig(mode); |
| } |
| -void BackgroundTracingManagerImpl::OnHistogramChanged( |
| - const std::string& histogram_name, |
| - base::Histogram::Sample reference_value, |
| - base::Histogram::Sample actual_value) { |
| +void BackgroundTracingManagerImpl::OnHistogramTrigger( |
| + const std::string& histogram_name) { |
| if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { |
| content::BrowserThread::PostTask( |
| content::BrowserThread::UI, FROM_HERE, |
| - base::Bind(&BackgroundTracingManagerImpl::OnHistogramChanged, |
| - base::Unretained(this), histogram_name, reference_value, |
| - actual_value)); |
| + base::Bind(&BackgroundTracingManagerImpl::OnHistogramTrigger, |
| + base::Unretained(this), histogram_name)); |
| return; |
| } |
| CHECK(config_ && |
| config_->mode == BackgroundTracingConfig::PREEMPTIVE_TRACING_MODE); |
| - if (reference_value > actual_value) |
| + if (!is_tracing_ || is_gathering_) |
| return; |
| - if (!is_tracing_ || is_gathering_) |
| + BackgroundTracingPreemptiveConfig* preemptive_config = |
| + static_cast<BackgroundTracingPreemptiveConfig*>(config_.get()); |
| + for (const auto& config : preemptive_config->configs) { |
| + if (config.type != BackgroundTracingPreemptiveConfig:: |
| + MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE) { |
| + continue; |
| + } |
| + |
| + if (config.histogram_trigger_info.histogram_name == histogram_name) { |
| + RecordBackgroundTracingMetric(PREEMPTIVE_TRIGGERED); |
| + BeginFinalizing(StartedFinalizingCallback()); |
| + } |
| + } |
| +} |
| + |
| +void BackgroundTracingManagerImpl::OnHistogramChangedCallback( |
| + const std::string& histogram_name, |
| + base::Histogram::Sample reference_value, |
| + base::Histogram::Sample actual_value) { |
| + if (reference_value > actual_value) |
| return; |
| - RecordBackgroundTracingMetric(PREEMPTIVE_TRIGGERED); |
| - BeginFinalizing(StartedFinalizingCallback()); |
| + OnHistogramTrigger(histogram_name); |
| } |
| bool BackgroundTracingManagerImpl::SetActiveScenario( |
| @@ -248,6 +270,51 @@ bool BackgroundTracingManagerImpl::HasActiveScenarioForTesting() { |
| return config_; |
| } |
| +void BackgroundTracingManagerImpl::OnTraceMessageFilterAdded( |
| + TraceMessageFilter* filter) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + SetupFilterFromConfig(filter, BIND_CALLBACKS); |
| +} |
| + |
| +void BackgroundTracingManagerImpl::SetupFiltersFromConfig( |
| + BackgroundTracingManagerImpl::SetupUMACallMode mode) { |
| + TracingControllerImpl::TraceMessageFilterSet filters; |
| + TracingControllerImpl::GetInstance()->GetTraceMessageFilters(&filters); |
| + |
| + for (auto& filter : filters) |
| + SetupFilterFromConfig(filter, mode); |
| +} |
| + |
| +void BackgroundTracingManagerImpl::SetupFilterFromConfig( |
| + scoped_refptr<TraceMessageFilter> filter, |
| + BackgroundTracingManagerImpl::SetupUMACallMode mode) { |
| + if (!config_ || |
| + config_->mode != BackgroundTracingConfig::PREEMPTIVE_TRACING_MODE) |
| + return; |
| + |
| + BackgroundTracingPreemptiveConfig* preemptive_config = |
| + static_cast<BackgroundTracingPreemptiveConfig*>(config_.get()); |
| + |
| + const std::vector<BackgroundTracingPreemptiveConfig::MonitoringRule>& |
| + configs = preemptive_config->configs; |
|
dcheng
2015/07/27 17:19:58
You don't technically need this line anymore: just
shatch
2015/07/27 19:08:04
Done.
|
| + |
| + for (const auto& config : configs) { |
| + if (config.type != BackgroundTracingPreemptiveConfig:: |
| + MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE) { |
| + continue; |
| + } |
| + |
| + if (mode == CLEAR_CALLBACKS) { |
| + filter->Send(new TracingMsg_ClearUMACallback( |
| + config.histogram_trigger_info.histogram_name)); |
| + } else { |
| + filter->Send(new TracingMsg_SetUMACallback( |
| + config.histogram_trigger_info.histogram_name, |
| + config.histogram_trigger_info.histogram_value)); |
| + } |
| + } |
| +} |
| + |
| void BackgroundTracingManagerImpl::ValidateStartupScenario() { |
| if (!config_ || !delegate_) |
| return; |
| @@ -518,6 +585,8 @@ void BackgroundTracingManagerImpl::BeginFinalizing( |
| } |
| void BackgroundTracingManagerImpl::AbortScenario() { |
| + SetupUMACallbacks(CLEAR_CALLBACKS); |
| + |
| is_tracing_ = false; |
| config_.reset(); |