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

Side by Side Diff: base/task_scheduler/scheduler_worker_pool_impl.cc

Issue 2600023002: Remove worker pool names from TaskScheduler.TaskLatency.* histograms. (Closed)
Patch Set: self-review Created 3 years, 12 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/task_scheduler/scheduler_worker_pool_impl.h" 5 #include "base/task_scheduler/scheduler_worker_pool_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/atomicops.h" 12 #include "base/atomicops.h"
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/bind_helpers.h" 14 #include "base/bind_helpers.h"
15 #include "base/lazy_instance.h" 15 #include "base/lazy_instance.h"
16 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
17 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
18 #include "base/sequence_token.h" 18 #include "base/sequence_token.h"
19 #include "base/sequenced_task_runner.h" 19 #include "base/sequenced_task_runner.h"
20 #include "base/single_thread_task_runner.h" 20 #include "base/single_thread_task_runner.h"
21 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
22 #include "base/task_runner.h" 22 #include "base/task_runner.h"
23 #include "base/task_scheduler/delayed_task_manager.h" 23 #include "base/task_scheduler/delayed_task_manager.h"
24 #include "base/task_scheduler/task_tracker.h" 24 #include "base/task_scheduler/task_tracker.h"
25 #include "base/task_scheduler/task_traits.h"
25 #include "base/threading/platform_thread.h" 26 #include "base/threading/platform_thread.h"
26 #include "base/threading/thread_local.h" 27 #include "base/threading/thread_local.h"
27 #include "base/threading/thread_restrictions.h" 28 #include "base/threading/thread_restrictions.h"
28 #include "base/time/time.h" 29 #include "base/time/time.h"
29 30
30 namespace base { 31 namespace base {
31 namespace internal { 32 namespace internal {
32 33
33 namespace { 34 namespace {
34 35
35 constexpr char kPoolNameSuffix[] = "Pool"; 36 constexpr char kPoolNameSuffix[] = "Pool";
36 constexpr char kDetachDurationHistogramPrefix[] = 37 constexpr char kDetachDurationHistogramPrefix[] =
37 "TaskScheduler.DetachDuration."; 38 "TaskScheduler.DetachDuration.";
38 constexpr char kNumTasksBeforeDetachHistogramPrefix[] = 39 constexpr char kNumTasksBeforeDetachHistogramPrefix[] =
39 "TaskScheduler.NumTasksBeforeDetach."; 40 "TaskScheduler.NumTasksBeforeDetach.";
40 constexpr char kNumTasksBetweenWaitsHistogramPrefix[] = 41 constexpr char kNumTasksBetweenWaitsHistogramPrefix[] =
41 "TaskScheduler.NumTasksBetweenWaits."; 42 "TaskScheduler.NumTasksBetweenWaits.";
42 constexpr char kTaskLatencyHistogramPrefix[] = "TaskScheduler.TaskLatency.";
43 43
44 // SchedulerWorkerPool that owns the current thread, if any. 44 // SchedulerWorkerPool that owns the current thread, if any.
45 LazyInstance<ThreadLocalPointer<const SchedulerWorkerPool>>::Leaky 45 LazyInstance<ThreadLocalPointer<const SchedulerWorkerPool>>::Leaky
46 tls_current_worker_pool = LAZY_INSTANCE_INITIALIZER; 46 tls_current_worker_pool = LAZY_INSTANCE_INITIALIZER;
47 47
48 // A task runner that runs tasks with the PARALLEL ExecutionMode. 48 // A task runner that runs tasks with the PARALLEL ExecutionMode.
49 class SchedulerParallelTaskRunner : public TaskRunner { 49 class SchedulerParallelTaskRunner : public TaskRunner {
50 public: 50 public:
51 // Constructs a SchedulerParallelTaskRunner which can be used to post tasks so 51 // Constructs a SchedulerParallelTaskRunner which can be used to post tasks so
52 // long as |worker_pool| is alive. 52 // long as |worker_pool| is alive.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 122
123 // Sequence for all Tasks posted through this TaskRunner. 123 // Sequence for all Tasks posted through this TaskRunner.
124 const scoped_refptr<Sequence> sequence_ = new Sequence; 124 const scoped_refptr<Sequence> sequence_ = new Sequence;
125 125
126 const TaskTraits traits_; 126 const TaskTraits traits_;
127 SchedulerWorkerPool* const worker_pool_; 127 SchedulerWorkerPool* const worker_pool_;
128 128
129 DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner); 129 DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner);
130 }; 130 };
131 131
132 HistogramBase* GetTaskLatencyHistogram(const std::string& pool_name,
133 TaskPriority task_priority) {
134 const char* task_priority_suffix = nullptr;
135 switch (task_priority) {
136 case TaskPriority::BACKGROUND:
137 task_priority_suffix = ".BackgroundTaskPriority";
138 break;
139 case TaskPriority::USER_VISIBLE:
140 task_priority_suffix = ".UserVisibleTaskPriority";
141 break;
142 case TaskPriority::USER_BLOCKING:
143 task_priority_suffix = ".UserBlockingTaskPriority";
144 break;
145 }
146
147 // Mimics the UMA_HISTOGRAM_TIMES macro.
148 return Histogram::FactoryTimeGet(kTaskLatencyHistogramPrefix + pool_name +
149 kPoolNameSuffix + task_priority_suffix,
150 TimeDelta::FromMilliseconds(1),
151 TimeDelta::FromSeconds(10), 50,
152 HistogramBase::kUmaTargetedHistogramFlag);
153 }
154
155 // Only used in DCHECKs. 132 // Only used in DCHECKs.
156 bool ContainsWorker( 133 bool ContainsWorker(
157 const std::vector<std::unique_ptr<SchedulerWorker>>& workers, 134 const std::vector<std::unique_ptr<SchedulerWorker>>& workers,
158 const SchedulerWorker* worker) { 135 const SchedulerWorker* worker) {
159 auto it = std::find_if(workers.begin(), workers.end(), 136 auto it = std::find_if(workers.begin(), workers.end(),
160 [worker](const std::unique_ptr<SchedulerWorker>& i) { 137 [worker](const std::unique_ptr<SchedulerWorker>& i) {
161 return i.get() == worker; 138 return i.get() == worker;
162 }); 139 });
163 return it != workers.end(); 140 return it != workers.end();
164 } 141 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 int index); 209 int index);
233 ~SchedulerWorkerDelegateImpl() override; 210 ~SchedulerWorkerDelegateImpl() override;
234 211
235 PriorityQueue* single_threaded_priority_queue() { 212 PriorityQueue* single_threaded_priority_queue() {
236 return &single_threaded_priority_queue_; 213 return &single_threaded_priority_queue_;
237 } 214 }
238 215
239 // SchedulerWorker::Delegate: 216 // SchedulerWorker::Delegate:
240 void OnMainEntry(SchedulerWorker* worker) override; 217 void OnMainEntry(SchedulerWorker* worker) override;
241 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override; 218 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override;
242 void DidRunTaskWithPriority(TaskPriority task_priority, 219 void DidRunTask() override;
243 const TimeDelta& task_latency) override;
244 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override; 220 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override;
245 TimeDelta GetSleepTimeout() override; 221 TimeDelta GetSleepTimeout() override;
246 bool CanDetach(SchedulerWorker* worker) override; 222 bool CanDetach(SchedulerWorker* worker) override;
247 void OnDetach() override; 223 void OnDetach() override;
248 224
249 void RegisterSingleThreadTaskRunner() { 225 void RegisterSingleThreadTaskRunner() {
250 // No barrier as barriers only affect sequential consistency which is 226 // No barrier as barriers only affect sequential consistency which is
251 // irrelevant in a single variable use case (they don't force an immediate 227 // irrelevant in a single variable use case (they don't force an immediate
252 // flush anymore than atomics do by default). 228 // flush anymore than atomics do by default).
253 subtle::NoBarrier_AtomicIncrement(&num_single_threaded_runners_, 1); 229 subtle::NoBarrier_AtomicIncrement(&num_single_threaded_runners_, 1);
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 DCHECK(sequence); 569 DCHECK(sequence);
594 570
595 outer_->RemoveFromIdleWorkersStack(worker); 571 outer_->RemoveFromIdleWorkersStack(worker);
596 idle_start_time_ = TimeTicks(); 572 idle_start_time_ = TimeTicks();
597 did_detach_since_last_get_work_ = false; 573 did_detach_since_last_get_work_ = false;
598 last_get_work_returned_nullptr_ = false; 574 last_get_work_returned_nullptr_ = false;
599 575
600 return sequence; 576 return sequence;
601 } 577 }
602 578
603 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: 579 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::DidRunTask() {
604 DidRunTaskWithPriority(TaskPriority task_priority,
605 const TimeDelta& task_latency) {
606 ++num_tasks_since_last_wait_; 580 ++num_tasks_since_last_wait_;
607 ++num_tasks_since_last_detach_; 581 ++num_tasks_since_last_detach_;
608
609 const int priority_index = static_cast<int>(task_priority);
610
611 // As explained in the header file, histograms are allocated on demand. It
612 // doesn't matter if an element of |task_latency_histograms_| is set multiple
613 // times since GetTaskLatencyHistogram() is idempotent. As explained in the
614 // comment at the top of histogram_macros.h, barriers are required.
615 HistogramBase* task_latency_histogram = reinterpret_cast<HistogramBase*>(
616 subtle::Acquire_Load(&outer_->task_latency_histograms_[priority_index]));
617 if (!task_latency_histogram) {
618 task_latency_histogram =
619 GetTaskLatencyHistogram(outer_->name_, task_priority);
620 subtle::Release_Store(
621 &outer_->task_latency_histograms_[priority_index],
622 reinterpret_cast<subtle::AtomicWord>(task_latency_histogram));
623 }
624
625 task_latency_histogram->AddTime(task_latency);
626 } 582 }
627 583
628 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: 584 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
629 ReEnqueueSequence(scoped_refptr<Sequence> sequence) { 585 ReEnqueueSequence(scoped_refptr<Sequence> sequence) {
630 if (last_sequence_is_single_threaded_) { 586 if (last_sequence_is_single_threaded_) {
631 // A single-threaded Sequence is always re-enqueued in the single-threaded 587 // A single-threaded Sequence is always re-enqueued in the single-threaded
632 // PriorityQueue from which it was extracted. 588 // PriorityQueue from which it was extracted.
633 const SequenceSortKey sequence_sort_key = sequence->GetSortKey(); 589 const SequenceSortKey sequence_sort_key = sequence->GetSortKey();
634 single_threaded_priority_queue_.BeginTransaction()->Push( 590 single_threaded_priority_queue_.BeginTransaction()->Push(
635 std::move(sequence), sequence_sort_key); 591 std::move(sequence), sequence_sort_key);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); 755 AutoSchedulerLock auto_lock(idle_workers_stack_lock_);
800 idle_workers_stack_.Remove(worker); 756 idle_workers_stack_.Remove(worker);
801 } 757 }
802 758
803 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { 759 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() {
804 return !worker_detachment_disallowed_.IsSet(); 760 return !worker_detachment_disallowed_.IsSet();
805 } 761 }
806 762
807 } // namespace internal 763 } // namespace internal
808 } // namespace base 764 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698