| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/threading/sequenced_worker_pool.h" | 5 #include "base/threading/sequenced_worker_pool.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 55 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
| 56 class SequencedWorkerPoolTaskRunner : public TaskRunner { | 56 class SequencedWorkerPoolTaskRunner : public TaskRunner { |
| 57 public: | 57 public: |
| 58 SequencedWorkerPoolTaskRunner( | 58 SequencedWorkerPoolTaskRunner( |
| 59 const scoped_refptr<SequencedWorkerPool>& pool, | 59 const scoped_refptr<SequencedWorkerPool>& pool, |
| 60 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 60 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
| 61 | 61 |
| 62 // TaskRunner implementation | 62 // TaskRunner implementation |
| 63 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | 63 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 64 const Closure& task, | 64 const Closure& task, |
| 65 int64 delay_ms) OVERRIDE; | |
| 66 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | |
| 67 const Closure& task, | |
| 68 TimeDelta delay) OVERRIDE; | 65 TimeDelta delay) OVERRIDE; |
| 69 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; | 66 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
| 70 | 67 |
| 71 private: | 68 private: |
| 72 virtual ~SequencedWorkerPoolTaskRunner(); | 69 virtual ~SequencedWorkerPoolTaskRunner(); |
| 73 | 70 |
| 74 // Helper function for posting a delayed task. Asserts that the delay is | 71 // Helper function for posting a delayed task. Asserts that the delay is |
| 75 // zero because non-zero delays are not yet supported. | 72 // zero because non-zero delays are not yet supported. |
| 76 bool PostDelayedTaskAssertZeroDelay( | 73 bool PostDelayedTaskAssertZeroDelay( |
| 77 const tracked_objects::Location& from_here, | 74 const tracked_objects::Location& from_here, |
| 78 const Closure& task, | 75 const Closure& task, |
| 79 int64 delay_ms); | |
| 80 bool PostDelayedTaskAssertZeroDelay( | |
| 81 const tracked_objects::Location& from_here, | |
| 82 const Closure& task, | |
| 83 TimeDelta delay); | 76 TimeDelta delay); |
| 84 | 77 |
| 85 const scoped_refptr<SequencedWorkerPool> pool_; | 78 const scoped_refptr<SequencedWorkerPool> pool_; |
| 86 | 79 |
| 87 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 80 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
| 88 | 81 |
| 89 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); | 82 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); |
| 90 }; | 83 }; |
| 91 | 84 |
| 92 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( | 85 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( |
| 93 const scoped_refptr<SequencedWorkerPool>& pool, | 86 const scoped_refptr<SequencedWorkerPool>& pool, |
| 94 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 87 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
| 95 : pool_(pool), | 88 : pool_(pool), |
| 96 shutdown_behavior_(shutdown_behavior) { | 89 shutdown_behavior_(shutdown_behavior) { |
| 97 } | 90 } |
| 98 | 91 |
| 99 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { | 92 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { |
| 100 } | 93 } |
| 101 | 94 |
| 102 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( | 95 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( |
| 103 const tracked_objects::Location& from_here, | 96 const tracked_objects::Location& from_here, |
| 104 const Closure& task, | 97 const Closure& task, |
| 105 int64 delay_ms) { | |
| 106 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); | |
| 107 } | |
| 108 | |
| 109 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( | |
| 110 const tracked_objects::Location& from_here, | |
| 111 const Closure& task, | |
| 112 TimeDelta delay) { | 98 TimeDelta delay) { |
| 113 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 99 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
| 114 } | 100 } |
| 115 | 101 |
| 116 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { | 102 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
| 117 return pool_->RunsTasksOnCurrentThread(); | 103 return pool_->RunsTasksOnCurrentThread(); |
| 118 } | 104 } |
| 119 | 105 |
| 120 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( | 106 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( |
| 121 const tracked_objects::Location& from_here, | 107 const tracked_objects::Location& from_here, |
| 122 const Closure& task, | 108 const Closure& task, |
| 123 int64 delay_ms) { | 109 TimeDelta delay) { |
| 124 // TODO(francoisk777@gmail.com): Change the following two statements once | 110 // TODO(francoisk777@gmail.com): Change the following two statements once |
| 125 // SequencedWorkerPool supports non-zero delays. | 111 // SequencedWorkerPool supports non-zero delays. |
| 126 DCHECK_EQ(delay_ms, 0) | 112 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0) |
| 127 << "SequencedWorkerPoolTaskRunner does not yet support non-zero delays"; | 113 << "SequencedWorkerPoolTaskRunner does not yet support non-zero delays"; |
| 128 return pool_->PostWorkerTaskWithShutdownBehavior( | 114 return pool_->PostWorkerTaskWithShutdownBehavior( |
| 129 from_here, task, shutdown_behavior_); | 115 from_here, task, shutdown_behavior_); |
| 130 } | 116 } |
| 131 | 117 |
| 132 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( | |
| 133 const tracked_objects::Location& from_here, | |
| 134 const Closure& task, | |
| 135 TimeDelta delay) { | |
| 136 return PostDelayedTaskAssertZeroDelay(from_here, | |
| 137 task, | |
| 138 delay.InMillisecondsRoundedUp()); | |
| 139 } | |
| 140 | |
| 141 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ | 118 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ |
| 142 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a | 119 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
| 143 // fixed sequence token. | 120 // fixed sequence token. |
| 144 // | 121 // |
| 145 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 122 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
| 146 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { | 123 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { |
| 147 public: | 124 public: |
| 148 SequencedWorkerPoolSequencedTaskRunner( | 125 SequencedWorkerPoolSequencedTaskRunner( |
| 149 const scoped_refptr<SequencedWorkerPool>& pool, | 126 const scoped_refptr<SequencedWorkerPool>& pool, |
| 150 SequencedWorkerPool::SequenceToken token, | 127 SequencedWorkerPool::SequenceToken token, |
| 151 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 128 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
| 152 | 129 |
| 153 // TaskRunner implementation | 130 // TaskRunner implementation |
| 154 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | 131 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 155 const Closure& task, | 132 const Closure& task, |
| 156 int64 delay_ms) OVERRIDE; | |
| 157 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | |
| 158 const Closure& task, | |
| 159 TimeDelta delay) OVERRIDE; | 133 TimeDelta delay) OVERRIDE; |
| 160 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; | 134 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
| 161 | 135 |
| 162 // SequencedTaskRunner implementation | 136 // SequencedTaskRunner implementation |
| 163 virtual bool PostNonNestableDelayedTask( | 137 virtual bool PostNonNestableDelayedTask( |
| 164 const tracked_objects::Location& from_here, | 138 const tracked_objects::Location& from_here, |
| 165 const Closure& task, | 139 const Closure& task, |
| 166 int64 delay_ms) OVERRIDE; | |
| 167 virtual bool PostNonNestableDelayedTask( | |
| 168 const tracked_objects::Location& from_here, | |
| 169 const Closure& task, | |
| 170 TimeDelta delay) OVERRIDE; | 140 TimeDelta delay) OVERRIDE; |
| 171 | 141 |
| 172 private: | 142 private: |
| 173 virtual ~SequencedWorkerPoolSequencedTaskRunner(); | 143 virtual ~SequencedWorkerPoolSequencedTaskRunner(); |
| 174 | 144 |
| 175 // Helper function for posting a delayed task. Asserts that the delay is | 145 // Helper function for posting a delayed task. Asserts that the delay is |
| 176 // zero because non-zero delays are not yet supported. | 146 // zero because non-zero delays are not yet supported. |
| 177 bool PostDelayedTaskAssertZeroDelay( | 147 bool PostDelayedTaskAssertZeroDelay( |
| 178 const tracked_objects::Location& from_here, | 148 const tracked_objects::Location& from_here, |
| 179 const Closure& task, | 149 const Closure& task, |
| 180 int64 delay_ms); | |
| 181 bool PostDelayedTaskAssertZeroDelay( | |
| 182 const tracked_objects::Location& from_here, | |
| 183 const Closure& task, | |
| 184 TimeDelta delay); | 150 TimeDelta delay); |
| 185 | 151 |
| 186 const scoped_refptr<SequencedWorkerPool> pool_; | 152 const scoped_refptr<SequencedWorkerPool> pool_; |
| 187 | 153 |
| 188 const SequencedWorkerPool::SequenceToken token_; | 154 const SequencedWorkerPool::SequenceToken token_; |
| 189 | 155 |
| 190 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 156 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
| 191 | 157 |
| 192 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); | 158 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); |
| 193 }; | 159 }; |
| 194 | 160 |
| 195 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( | 161 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( |
| 196 const scoped_refptr<SequencedWorkerPool>& pool, | 162 const scoped_refptr<SequencedWorkerPool>& pool, |
| 197 SequencedWorkerPool::SequenceToken token, | 163 SequencedWorkerPool::SequenceToken token, |
| 198 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 164 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
| 199 : pool_(pool), | 165 : pool_(pool), |
| 200 token_(token), | 166 token_(token), |
| 201 shutdown_behavior_(shutdown_behavior) { | 167 shutdown_behavior_(shutdown_behavior) { |
| 202 } | 168 } |
| 203 | 169 |
| 204 SequencedWorkerPoolSequencedTaskRunner:: | 170 SequencedWorkerPoolSequencedTaskRunner:: |
| 205 ~SequencedWorkerPoolSequencedTaskRunner() { | 171 ~SequencedWorkerPoolSequencedTaskRunner() { |
| 206 } | 172 } |
| 207 | 173 |
| 208 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | 174 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( |
| 209 const tracked_objects::Location& from_here, | 175 const tracked_objects::Location& from_here, |
| 210 const Closure& task, | 176 const Closure& task, |
| 211 int64 delay_ms) { | |
| 212 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); | |
| 213 } | |
| 214 | |
| 215 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | |
| 216 const tracked_objects::Location& from_here, | |
| 217 const Closure& task, | |
| 218 TimeDelta delay) { | 177 TimeDelta delay) { |
| 219 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 178 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
| 220 } | 179 } |
| 221 | 180 |
| 222 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { | 181 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { |
| 223 return pool_->IsRunningSequenceOnCurrentThread(token_); | 182 return pool_->IsRunningSequenceOnCurrentThread(token_); |
| 224 } | 183 } |
| 225 | 184 |
| 226 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | 185 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( |
| 227 const tracked_objects::Location& from_here, | 186 const tracked_objects::Location& from_here, |
| 228 const Closure& task, | 187 const Closure& task, |
| 229 int64 delay_ms) { | |
| 230 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); | |
| 231 } | |
| 232 | |
| 233 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | |
| 234 const tracked_objects::Location& from_here, | |
| 235 const Closure& task, | |
| 236 TimeDelta delay) { | 188 TimeDelta delay) { |
| 237 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 189 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
| 238 } | 190 } |
| 239 | 191 |
| 240 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( | 192 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( |
| 241 const tracked_objects::Location& from_here, | 193 const tracked_objects::Location& from_here, |
| 242 const Closure& task, | 194 const Closure& task, |
| 243 int64 delay_ms) { | 195 TimeDelta delay) { |
| 244 // TODO(francoisk777@gmail.com): Change the following two statements once | 196 // TODO(francoisk777@gmail.com): Change the following two statements once |
| 245 // SequencedWorkerPool supports non-zero delays. | 197 // SequencedWorkerPool supports non-zero delays. |
| 246 DCHECK_EQ(delay_ms, 0) | 198 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0) |
| 247 << "SequencedWorkerPoolSequencedTaskRunner does not yet support non-zero" | 199 << "SequencedWorkerPoolSequencedTaskRunner does not yet support non-zero" |
| 248 " delays"; | 200 " delays"; |
| 249 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( | 201 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
| 250 token_, from_here, task, shutdown_behavior_); | 202 token_, from_here, task, shutdown_behavior_); |
| 251 } | 203 } |
| 252 | 204 |
| 253 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( | |
| 254 const tracked_objects::Location& from_here, | |
| 255 const Closure& task, | |
| 256 TimeDelta delay) { | |
| 257 return PostDelayedTaskAssertZeroDelay(from_here, | |
| 258 task, | |
| 259 delay.InMillisecondsRoundedUp()); | |
| 260 } | |
| 261 | |
| 262 } // namespace | 205 } // namespace |
| 263 | 206 |
| 264 // Worker --------------------------------------------------------------------- | 207 // Worker --------------------------------------------------------------------- |
| 265 | 208 |
| 266 class SequencedWorkerPool::Worker : public SimpleThread { | 209 class SequencedWorkerPool::Worker : public SimpleThread { |
| 267 public: | 210 public: |
| 268 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it | 211 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it |
| 269 // around as long as we are running. | 212 // around as long as we are running. |
| 270 Worker(const scoped_refptr<SequencedWorkerPool>& worker_pool, | 213 Worker(const scoped_refptr<SequencedWorkerPool>& worker_pool, |
| 271 int thread_number, | 214 int thread_number, |
| (...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1026 const tracked_objects::Location& from_here, | 969 const tracked_objects::Location& from_here, |
| 1027 const Closure& task, | 970 const Closure& task, |
| 1028 WorkerShutdown shutdown_behavior) { | 971 WorkerShutdown shutdown_behavior) { |
| 1029 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, | 972 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, |
| 1030 from_here, task); | 973 from_here, task); |
| 1031 } | 974 } |
| 1032 | 975 |
| 1033 bool SequencedWorkerPool::PostDelayedTask( | 976 bool SequencedWorkerPool::PostDelayedTask( |
| 1034 const tracked_objects::Location& from_here, | 977 const tracked_objects::Location& from_here, |
| 1035 const Closure& task, | 978 const Closure& task, |
| 1036 int64 delay_ms) { | |
| 1037 // TODO(akalin): Add support for non-zero delays. | |
| 1038 DCHECK_EQ(delay_ms, 0); | |
| 1039 return PostWorkerTask(from_here, task); | |
| 1040 } | |
| 1041 | |
| 1042 bool SequencedWorkerPool::PostDelayedTask( | |
| 1043 const tracked_objects::Location& from_here, | |
| 1044 const Closure& task, | |
| 1045 TimeDelta delay) { | 979 TimeDelta delay) { |
| 1046 // TODO(akalin): Add support for non-zero delays. | 980 // TODO(akalin): Add support for non-zero delays. |
| 1047 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0); | 981 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0); |
| 1048 return PostWorkerTask(from_here, task); | 982 return PostWorkerTask(from_here, task); |
| 1049 } | 983 } |
| 1050 | 984 |
| 1051 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { | 985 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
| 1052 return inner_->RunsTasksOnCurrentThread(); | 986 return inner_->RunsTasksOnCurrentThread(); |
| 1053 } | 987 } |
| 1054 | 988 |
| 1055 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | 989 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
| 1056 SequenceToken sequence_token) const { | 990 SequenceToken sequence_token) const { |
| 1057 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | 991 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
| 1058 } | 992 } |
| 1059 | 993 |
| 1060 void SequencedWorkerPool::FlushForTesting() { | 994 void SequencedWorkerPool::FlushForTesting() { |
| 1061 inner_->FlushForTesting(); | 995 inner_->FlushForTesting(); |
| 1062 } | 996 } |
| 1063 | 997 |
| 1064 void SequencedWorkerPool::SignalHasWorkForTesting() { | 998 void SequencedWorkerPool::SignalHasWorkForTesting() { |
| 1065 inner_->SignalHasWorkForTesting(); | 999 inner_->SignalHasWorkForTesting(); |
| 1066 } | 1000 } |
| 1067 | 1001 |
| 1068 void SequencedWorkerPool::Shutdown() { | 1002 void SequencedWorkerPool::Shutdown() { |
| 1069 DCHECK(constructor_message_loop_->BelongsToCurrentThread()); | 1003 DCHECK(constructor_message_loop_->BelongsToCurrentThread()); |
| 1070 inner_->Shutdown(); | 1004 inner_->Shutdown(); |
| 1071 } | 1005 } |
| 1072 | 1006 |
| 1073 } // namespace base | 1007 } // namespace base |
| OLD | NEW |