Index: chromecast/browser/metrics/external_metrics.cc |
diff --git a/chromecast/browser/metrics/external_metrics.cc b/chromecast/browser/metrics/external_metrics.cc |
index 40de5ba0ad33da89e63b01eeb7b0ed8feb4df51c..8acd4aef305adcdcf7669177359fa55684aaec8f 100644 |
--- a/chromecast/browser/metrics/external_metrics.cc |
+++ b/chromecast/browser/metrics/external_metrics.cc |
@@ -16,6 +16,9 @@ |
#include "base/metrics/histogram.h" |
#include "base/metrics/sparse_histogram.h" |
#include "base/metrics/statistics_recorder.h" |
+#include "base/task_scheduler/post_task.h" |
+#include "base/task_scheduler/task_traits.h" |
+#include "base/threading/thread_restrictions.h" |
#include "chromecast/base/metrics/cast_histograms.h" |
#include "chromecast/base/metrics/cast_metrics_helper.h" |
#include "chromecast/browser/metrics/cast_stability_metrics_provider.h" |
@@ -47,6 +50,16 @@ bool CheckLinearValues(const std::string& name, int maximum) { |
return CheckValues(name, 1, maximum, maximum + 1); |
} |
+// Returns a task runner appropriate for running background tasks that perform |
+// file I/O. |
+scoped_refptr<base::SequencedTaskRunner> CreateTaskRunner() { |
+ // Note that CollectEvents accesses a global singleton, and thus |
+ // scheduling with CONTINUE_ON_SHUTDOWN might not be safe. |
+ return base::CreateSequencedTaskRunnerWithTraits( |
+ {base::MayBlock(), base::TaskPriority::BACKGROUND, |
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); |
+} |
+ |
} // namespace |
// The interval between external metrics collections in seconds |
@@ -57,45 +70,41 @@ ExternalMetrics::ExternalMetrics( |
const std::string& uma_events_file) |
: stability_provider_(stability_provider), |
uma_events_file_(uma_events_file), |
+ task_runner_(CreateTaskRunner()), |
weak_factory_(this) { |
DCHECK(stability_provider); |
+ |
+ // The sequence checker verifies that all of the interesting work done by this |
+ // class is done on the |task_runner_|, rather than on the sequence that this |
+ // object was created on. |
+ DETACH_FROM_SEQUENCE(sequence_checker_); |
} |
ExternalMetrics::~ExternalMetrics() { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
} |
void ExternalMetrics::StopAndDestroy() { |
- content::BrowserThread::DeleteSoon( |
- content::BrowserThread::FILE, FROM_HERE, this); |
+ task_runner_->DeleteSoon(FROM_HERE, this); |
} |
void ExternalMetrics::Start() { |
- bool result = content::BrowserThread::PostDelayedTask( |
- content::BrowserThread::FILE, |
- FROM_HERE, |
- base::Bind(&ExternalMetrics::CollectEventsAndReschedule, |
- weak_factory_.GetWeakPtr()), |
- base::TimeDelta::FromSeconds(kExternalMetricsCollectionIntervalSeconds)); |
- DCHECK(result); |
+ ScheduleCollection(); |
} |
void ExternalMetrics::ProcessExternalEvents(const base::Closure& cb) { |
- content::BrowserThread::PostTaskAndReply( |
- content::BrowserThread::FILE, FROM_HERE, |
- base::Bind( |
- base::IgnoreResult(&ExternalMetrics::CollectEvents), |
- weak_factory_.GetWeakPtr()), |
+ task_runner_->PostTaskAndReply( |
+ FROM_HERE, |
+ base::BindOnce(base::IgnoreResult(&ExternalMetrics::CollectEvents), |
+ weak_factory_.GetWeakPtr()), |
cb); |
} |
void ExternalMetrics::RecordCrash(const std::string& crash_kind) { |
content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&CastStabilityMetricsProvider::LogExternalCrash, |
- base::Unretained(stability_provider_), |
- crash_kind)); |
+ content::BrowserThread::UI, FROM_HERE, |
+ base::BindOnce(&CastStabilityMetricsProvider::LogExternalCrash, |
+ base::Unretained(stability_provider_), crash_kind)); |
} |
void ExternalMetrics::RecordSparseHistogram( |
@@ -107,6 +116,9 @@ void ExternalMetrics::RecordSparseHistogram( |
} |
int ExternalMetrics::CollectEvents() { |
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ |
std::vector<std::unique_ptr<::metrics::MetricSample>> samples; |
::metrics::SerializationUtils::ReadAndTruncateMetricsFromFile( |
uma_events_file_, &samples); |
@@ -152,15 +164,17 @@ int ExternalMetrics::CollectEvents() { |
} |
void ExternalMetrics::CollectEventsAndReschedule() { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
CollectEvents(); |
- bool result = content::BrowserThread::PostDelayedTask( |
- content::BrowserThread::FILE, |
+ ScheduleCollection(); |
+} |
+ |
+void ExternalMetrics::ScheduleCollection() { |
+ task_runner_->PostDelayedTask( |
FROM_HERE, |
- base::Bind(&ExternalMetrics::CollectEventsAndReschedule, |
- weak_factory_.GetWeakPtr()), |
+ base::BindOnce(&ExternalMetrics::CollectEventsAndReschedule, |
+ weak_factory_.GetWeakPtr()), |
base::TimeDelta::FromSeconds(kExternalMetricsCollectionIntervalSeconds)); |
- DCHECK(result); |
} |
} // namespace metrics |