Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: base/task_scheduler/scheduler_worker_pool_impl.cc

Issue 2430633003: TaskScheduler: Record TaskScheduler.NumTasksBeforeDetach.* from OnDetach(). (Closed)
Patch Set: CR gab #3 rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/task_scheduler/scheduler_worker.cc ('k') | base/task_scheduler/scheduler_worker_pool_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/task_scheduler/scheduler_worker_pool_impl.cc
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task_scheduler/scheduler_worker_pool_impl.cc
index 4a9ee43fb08fec7f4a78868cda81336c5e37e5ff..3aa05eafec698e2edbcf69a9730b5e913cd59268 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.cc
+++ b/base/task_scheduler/scheduler_worker_pool_impl.cc
@@ -237,14 +237,14 @@ class SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl
}
// SchedulerWorker::Delegate:
- void OnMainEntry(SchedulerWorker* worker,
- const TimeDelta& detach_duration) override;
+ void OnMainEntry(SchedulerWorker* worker) override;
scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override;
void DidRunTaskWithPriority(TaskPriority task_priority,
const TimeDelta& task_latency) override;
void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override;
TimeDelta GetSleepTimeout() override;
bool CanDetach(SchedulerWorker* worker) override;
+ void OnDetach() override;
void RegisterSingleThreadTaskRunner() {
// No barrier as barriers only affect sequential consistency which is
@@ -268,6 +268,9 @@ class SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl
// |single_threaded_priority_queue_|.
bool last_sequence_is_single_threaded_ = false;
+ // Time of the last detach.
+ TimeTicks last_detach_time_;
+
// Time when GetWork() first returned nullptr.
TimeTicks idle_start_time_;
@@ -481,8 +484,7 @@ SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
~SchedulerWorkerDelegateImpl() = default;
void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnMainEntry(
- SchedulerWorker* worker,
- const TimeDelta& detach_duration) {
+ SchedulerWorker* worker) {
#if DCHECK_IS_ON()
// Wait for |outer_->workers_created_| to avoid traversing
// |outer_->workers_| while it is being filled by Initialize().
@@ -492,13 +494,9 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnMainEntry(
DCHECK_EQ(num_tasks_since_last_wait_, 0U);
- // Record histograms if the worker detached in the past.
- if (!detach_duration.is_max()) {
- outer_->detach_duration_histogram_->AddTime(detach_duration);
- outer_->num_tasks_before_detach_histogram_->Add(
- num_tasks_since_last_detach_);
- num_tasks_since_last_detach_ = 0;
- did_detach_since_last_get_work_ = true;
+ if (!last_detach_time_.is_null()) {
+ outer_->detach_duration_histogram_->AddTime(TimeTicks::Now() -
+ last_detach_time_);
}
PlatformThread::SetName(
@@ -525,16 +523,15 @@ SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::GetWork(
// Record the TaskScheduler.NumTasksBetweenWaits histogram if the
// SchedulerWorker waited on its WaitableEvent since the last GetWork().
//
- // Note: When GetWork() returns nullptr for the first time after returning a
- // Sequence, SchedulerWorker waits on its WaitableEvent. When the wait stops
- // (either because WakeUp() was called or because the sleep timeout expired),
- // GetWork() is called and the histogram is recorded. If GetWork() returns
- // nullptr again, the SchedulerWorker may detach.
- // |did_detach_since_last_get_work_| is set to true from OnMainEntry() if the
- // SchedulerWorker detaches and wakes up again. The next call to GetWork()
- // won't record the histogram (which is correct since the SchedulerWorker
- // didn't wait on its WaitableEvent since the last time the histogram was
- // recorded).
+ // Note: When GetWork() starts returning nullptr, the SchedulerWorker waits on
+ // its WaitableEvent. When it wakes up (either because WakeUp() was called or
+ // because the sleep timeout expired), it calls GetWork() again. The code
+ // below records the histogram and, if GetWork() returns nullptr again, the
+ // SchedulerWorker may detach. If that happens,
+ // |did_detach_since_last_get_work_| is set to true and the next call to
+ // GetWork() won't record the histogram (which is correct since the
+ // SchedulerWorker didn't wait on its WaitableEvent since the last time the
+ // histogram was recorded).
if (last_get_work_returned_nullptr_ && !did_detach_since_last_get_work_) {
outer_->num_tasks_between_waits_histogram_->Add(num_tasks_since_last_wait_);
num_tasks_since_last_wait_ = 0;
@@ -659,6 +656,14 @@ bool SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::CanDetach(
return can_detach;
}
+void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnDetach() {
+ DCHECK(!did_detach_since_last_get_work_);
+ outer_->num_tasks_before_detach_histogram_->Add(num_tasks_since_last_detach_);
+ num_tasks_since_last_detach_ = 0;
+ did_detach_since_last_get_work_ = true;
+ last_detach_time_ = TimeTicks::Now();
+}
+
SchedulerWorkerPoolImpl::SchedulerWorkerPoolImpl(
StringPiece name,
SchedulerWorkerPoolParams::IORestriction io_restriction,
@@ -684,10 +689,9 @@ SchedulerWorkerPoolImpl::SchedulerWorkerPoolImpl(
TimeDelta::FromHours(1),
50,
HistogramBase::kUmaTargetedHistogramFlag)),
- // Mimics the UMA_HISTOGRAM_COUNTS_1000 macro. A SchedulerWorker is
- // expected to run between zero and a few hundreds of tasks before
- // detaching. When it runs more than 1000 tasks, there is no need to know
- // the exact number of tasks that ran.
+ // Mimics the UMA_HISTOGRAM_COUNTS_1000 macro. When a worker runs more
+ // than 1000 tasks before detaching, there is no need to know the exact
+ // number of tasks that ran.
num_tasks_before_detach_histogram_(Histogram::FactoryGet(
kNumTasksBeforeDetachHistogramPrefix + name_ + kPoolNameSuffix,
1,
« no previous file with comments | « base/task_scheduler/scheduler_worker.cc ('k') | base/task_scheduler/scheduler_worker_pool_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698