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..0374a1a5e02c1027b1f0207652c1432e39816f8a 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" |
@@ -62,30 +65,24 @@ ExternalMetrics::ExternalMetrics( |
} |
ExternalMetrics::~ExternalMetrics() { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
} |
gfhuang
2017/06/27 00:34:54
should we add a sequence_checker?
Ilya Sherman
2017/06/27 19:17:16
Done.
|
void ExternalMetrics::StopAndDestroy() { |
- content::BrowserThread::DeleteSoon( |
- content::BrowserThread::FILE, FROM_HERE, this); |
} |
gfhuang
2017/06/27 00:34:54
Are above 2 changes safe?
Now the object could be
Ilya Sherman
2017/06/27 19:17:16
Sorry, I missed that |this| was actually used with
|
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()), |
+ // Note that CollectEvents accesses a global singleton, and thus scheduling |
+ // with CONTINUE_ON_SHUTDOWN might not be safe. |
+ base::PostTaskWithTraitsAndReply( |
+ FROM_HERE, |
+ {base::MayBlock(), base::TaskPriority::BACKGROUND, |
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, |
+ base::Bind(base::IgnoreResult(&ExternalMetrics::CollectEvents), |
+ weak_factory_.GetWeakPtr()), |
gfhuang
2017/06/27 00:34:54
nit. BindOnce
Ilya Sherman
2017/06/27 19:17:16
Done.
|
cb); |
} |
gfhuang
2017/06/27 00:55:01
I think another issue is here.
because ScheduleCo
Ilya Sherman
2017/06/27 19:17:16
Yes, that's a good point, thanks! I got much too
|
@@ -107,6 +104,8 @@ void ExternalMetrics::RecordSparseHistogram( |
} |
int ExternalMetrics::CollectEvents() { |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ |
std::vector<std::unique_ptr<::metrics::MetricSample>> samples; |
::metrics::SerializationUtils::ReadAndTruncateMetricsFromFile( |
uma_events_file_, &samples); |
@@ -152,15 +151,20 @@ int ExternalMetrics::CollectEvents() { |
} |
void ExternalMetrics::CollectEventsAndReschedule() { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
CollectEvents(); |
- bool result = content::BrowserThread::PostDelayedTask( |
- content::BrowserThread::FILE, |
+ ScheduleCollection(); |
+} |
+ |
+void ExternalMetrics::ScheduleCollection() { |
+ // Note that CollectEvents accesses a global singleton, and thus scheduling |
+ // with CONTINUE_ON_SHUTDOWN might not be safe. |
+ base::PostDelayedTaskWithTraits( |
FROM_HERE, |
+ {base::MayBlock(), base::TaskPriority::BACKGROUND, |
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, |
base::Bind(&ExternalMetrics::CollectEventsAndReschedule, |
weak_factory_.GetWeakPtr()), |
base::TimeDelta::FromSeconds(kExternalMetricsCollectionIntervalSeconds)); |
- DCHECK(result); |
} |
} // namespace metrics |