| OLD | NEW |
| 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> |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 // long as |worker_pool| is alive. | 52 // long as |worker_pool| is alive. |
| 53 // TODO(robliao): Find a concrete way to manage |worker_pool|'s memory. | 53 // TODO(robliao): Find a concrete way to manage |worker_pool|'s memory. |
| 54 SchedulerParallelTaskRunner(const TaskTraits& traits, | 54 SchedulerParallelTaskRunner(const TaskTraits& traits, |
| 55 SchedulerWorkerPool* worker_pool) | 55 SchedulerWorkerPool* worker_pool) |
| 56 : traits_(traits), worker_pool_(worker_pool) { | 56 : traits_(traits), worker_pool_(worker_pool) { |
| 57 DCHECK(worker_pool_); | 57 DCHECK(worker_pool_); |
| 58 } | 58 } |
| 59 | 59 |
| 60 // TaskRunner: | 60 // TaskRunner: |
| 61 bool PostDelayedTask(const tracked_objects::Location& from_here, | 61 bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 62 const Closure& closure, | 62 Closure closure, |
| 63 TimeDelta delay) override { | 63 TimeDelta delay) override { |
| 64 // Post the task as part of a one-off single-task Sequence. | 64 // Post the task as part of a one-off single-task Sequence. |
| 65 return worker_pool_->PostTaskWithSequence( | 65 return worker_pool_->PostTaskWithSequence( |
| 66 MakeUnique<Task>(from_here, closure, traits_, delay), | 66 MakeUnique<Task>(from_here, std::move(closure), traits_, delay), |
| 67 make_scoped_refptr(new Sequence), nullptr); | 67 make_scoped_refptr(new Sequence), nullptr); |
| 68 } | 68 } |
| 69 | 69 |
| 70 bool RunsTasksOnCurrentThread() const override { | 70 bool RunsTasksOnCurrentThread() const override { |
| 71 return tls_current_worker_pool.Get().Get() == worker_pool_; | 71 return tls_current_worker_pool.Get().Get() == worker_pool_; |
| 72 } | 72 } |
| 73 | 73 |
| 74 private: | 74 private: |
| 75 ~SchedulerParallelTaskRunner() override = default; | 75 ~SchedulerParallelTaskRunner() override = default; |
| 76 | 76 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 87 // so long as |worker_pool| is alive. | 87 // so long as |worker_pool| is alive. |
| 88 // TODO(robliao): Find a concrete way to manage |worker_pool|'s memory. | 88 // TODO(robliao): Find a concrete way to manage |worker_pool|'s memory. |
| 89 SchedulerSequencedTaskRunner(const TaskTraits& traits, | 89 SchedulerSequencedTaskRunner(const TaskTraits& traits, |
| 90 SchedulerWorkerPool* worker_pool) | 90 SchedulerWorkerPool* worker_pool) |
| 91 : traits_(traits), worker_pool_(worker_pool) { | 91 : traits_(traits), worker_pool_(worker_pool) { |
| 92 DCHECK(worker_pool_); | 92 DCHECK(worker_pool_); |
| 93 } | 93 } |
| 94 | 94 |
| 95 // SequencedTaskRunner: | 95 // SequencedTaskRunner: |
| 96 bool PostDelayedTask(const tracked_objects::Location& from_here, | 96 bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 97 const Closure& closure, | 97 Closure closure, |
| 98 TimeDelta delay) override { | 98 TimeDelta delay) override { |
| 99 std::unique_ptr<Task> task(new Task(from_here, closure, traits_, delay)); | 99 std::unique_ptr<Task> task( |
| 100 new Task(from_here, std::move(closure), traits_, delay)); |
| 100 task->sequenced_task_runner_ref = this; | 101 task->sequenced_task_runner_ref = this; |
| 101 | 102 |
| 102 // Post the task as part of |sequence_|. | 103 // Post the task as part of |sequence_|. |
| 103 return worker_pool_->PostTaskWithSequence(std::move(task), sequence_, | 104 return worker_pool_->PostTaskWithSequence(std::move(task), sequence_, |
| 104 nullptr); | 105 nullptr); |
| 105 } | 106 } |
| 106 | 107 |
| 107 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 108 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
| 108 const Closure& closure, | 109 Closure closure, |
| 109 base::TimeDelta delay) override { | 110 base::TimeDelta delay) override { |
| 110 // Tasks are never nested within the task scheduler. | 111 // Tasks are never nested within the task scheduler. |
| 111 return PostDelayedTask(from_here, closure, delay); | 112 return PostDelayedTask(from_here, std::move(closure), delay); |
| 112 } | 113 } |
| 113 | 114 |
| 114 bool RunsTasksOnCurrentThread() const override { | 115 bool RunsTasksOnCurrentThread() const override { |
| 115 // TODO(fdoray): Rename TaskRunner::RunsTaskOnCurrentThread() to something | 116 // TODO(fdoray): Rename TaskRunner::RunsTaskOnCurrentThread() to something |
| 116 // that reflects this behavior more accurately. crbug.com/646905 | 117 // that reflects this behavior more accurately. crbug.com/646905 |
| 117 return sequence_->token() == SequenceToken::GetForCurrentThread(); | 118 return sequence_->token() == SequenceToken::GetForCurrentThread(); |
| 118 } | 119 } |
| 119 | 120 |
| 120 private: | 121 private: |
| 121 ~SchedulerSequencedTaskRunner() override = default; | 122 ~SchedulerSequencedTaskRunner() override = default; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 149 // Constructs a SchedulerSingleThreadTaskRunner which can be used to post | 150 // Constructs a SchedulerSingleThreadTaskRunner which can be used to post |
| 150 // tasks so long as |worker_pool| and |worker| are alive. | 151 // tasks so long as |worker_pool| and |worker| are alive. |
| 151 // TODO(robliao): Find a concrete way to manage the memory of |worker_pool| | 152 // TODO(robliao): Find a concrete way to manage the memory of |worker_pool| |
| 152 // and |worker|. | 153 // and |worker|. |
| 153 SchedulerSingleThreadTaskRunner(const TaskTraits& traits, | 154 SchedulerSingleThreadTaskRunner(const TaskTraits& traits, |
| 154 SchedulerWorkerPool* worker_pool, | 155 SchedulerWorkerPool* worker_pool, |
| 155 SchedulerWorker* worker); | 156 SchedulerWorker* worker); |
| 156 | 157 |
| 157 // SingleThreadTaskRunner: | 158 // SingleThreadTaskRunner: |
| 158 bool PostDelayedTask(const tracked_objects::Location& from_here, | 159 bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 159 const Closure& closure, | 160 Closure closure, |
| 160 TimeDelta delay) override { | 161 TimeDelta delay) override { |
| 161 std::unique_ptr<Task> task(new Task(from_here, closure, traits_, delay)); | 162 std::unique_ptr<Task> task( |
| 163 new Task(from_here, std::move(closure), traits_, delay)); |
| 162 task->single_thread_task_runner_ref = this; | 164 task->single_thread_task_runner_ref = this; |
| 163 | 165 |
| 164 // Post the task to be executed by |worker_| as part of |sequence_|. | 166 // Post the task to be executed by |worker_| as part of |sequence_|. |
| 165 return worker_pool_->PostTaskWithSequence(std::move(task), sequence_, | 167 return worker_pool_->PostTaskWithSequence(std::move(task), sequence_, |
| 166 worker_); | 168 worker_); |
| 167 } | 169 } |
| 168 | 170 |
| 169 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 171 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
| 170 const Closure& closure, | 172 Closure closure, |
| 171 base::TimeDelta delay) override { | 173 base::TimeDelta delay) override { |
| 172 // Tasks are never nested within the task scheduler. | 174 // Tasks are never nested within the task scheduler. |
| 173 return PostDelayedTask(from_here, closure, delay); | 175 return PostDelayedTask(from_here, std::move(closure), delay); |
| 174 } | 176 } |
| 175 | 177 |
| 176 bool RunsTasksOnCurrentThread() const override { | 178 bool RunsTasksOnCurrentThread() const override { |
| 177 // Even though this is a SingleThreadTaskRunner, test the actual sequence | 179 // Even though this is a SingleThreadTaskRunner, test the actual sequence |
| 178 // instead of the assigned worker so that another task randomly assigned | 180 // instead of the assigned worker so that another task randomly assigned |
| 179 // to the same worker doesn't return true by happenstance. | 181 // to the same worker doesn't return true by happenstance. |
| 180 return sequence_->token() == SequenceToken::GetForCurrentThread(); | 182 return sequence_->token() == SequenceToken::GetForCurrentThread(); |
| 181 } | 183 } |
| 182 | 184 |
| 183 private: | 185 private: |
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); | 761 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); |
| 760 idle_workers_stack_.Remove(worker); | 762 idle_workers_stack_.Remove(worker); |
| 761 } | 763 } |
| 762 | 764 |
| 763 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { | 765 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { |
| 764 return !worker_detachment_disallowed_.IsSet(); | 766 return !worker_detachment_disallowed_.IsSet(); |
| 765 } | 767 } |
| 766 | 768 |
| 767 } // namespace internal | 769 } // namespace internal |
| 768 } // namespace base | 770 } // namespace base |
| OLD | NEW |