| 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 #ifndef BASE_THREADING_SEQUENCED_WORKER_POOL_H_ | 5 #ifndef BASE_THREADING_SEQUENCED_WORKER_POOL_H_ |
| 6 #define BASE_THREADING_SEQUENCED_WORKER_POOL_H_ | 6 #define BASE_THREADING_SEQUENCED_WORKER_POOL_H_ |
| 7 | 7 |
| 8 #include <cstddef> | 8 #include <cstddef> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 // writing a preference file. | 114 // writing a preference file. |
| 115 // | 115 // |
| 116 // If a task is posted during shutdown, it will not get run since the | 116 // If a task is posted during shutdown, it will not get run since the |
| 117 // workers may already be stopped. In this case, the post operation will | 117 // workers may already be stopped. In this case, the post operation will |
| 118 // fail (return false) and the task will be deleted. | 118 // fail (return false) and the task will be deleted. |
| 119 BLOCK_SHUTDOWN, | 119 BLOCK_SHUTDOWN, |
| 120 }; | 120 }; |
| 121 | 121 |
| 122 // Opaque identifier that defines sequencing of tasks posted to the worker | 122 // Opaque identifier that defines sequencing of tasks posted to the worker |
| 123 // pool. | 123 // pool. |
| 124 class SequenceToken { | 124 class BASE_EXPORT SequenceToken { |
| 125 public: | 125 public: |
| 126 SequenceToken() : id_(0) {} | 126 SequenceToken() : id_(0) {} |
| 127 ~SequenceToken() {} | 127 ~SequenceToken() {} |
| 128 | 128 |
| 129 bool Equals(const SequenceToken& other) const { | 129 bool Equals(const SequenceToken& other) const { |
| 130 return id_ == other.id_; | 130 return id_ == other.id_; |
| 131 } | 131 } |
| 132 | 132 |
| 133 // Returns false if current thread is executing an unsequenced task. | 133 // Returns false if current thread is executing an unsequenced task. |
| 134 bool IsValid() const { | 134 bool IsValid() const { |
| 135 return id_ != 0; | 135 return id_ != 0; |
| 136 } | 136 } |
| 137 | 137 |
| 138 // Returns a string representation of this token. This method should only be |
| 139 // used for debugging. |
| 140 std::string ToString() const; |
| 141 |
| 138 private: | 142 private: |
| 139 friend class SequencedWorkerPool; | 143 friend class SequencedWorkerPool; |
| 140 | 144 |
| 141 explicit SequenceToken(int id) : id_(id) {} | 145 explicit SequenceToken(int id) : id_(id) {} |
| 142 | 146 |
| 143 int id_; | 147 int id_; |
| 144 }; | 148 }; |
| 145 | 149 |
| 146 // Allows tests to perform certain actions. | 150 // Allows tests to perform certain actions. |
| 147 class TestingObserver { | 151 class TestingObserver { |
| 148 public: | 152 public: |
| 149 virtual ~TestingObserver() {} | 153 virtual ~TestingObserver() {} |
| 150 virtual void OnHasWork() = 0; | 154 virtual void OnHasWork() = 0; |
| 151 virtual void WillWaitForShutdown() = 0; | 155 virtual void WillWaitForShutdown() = 0; |
| 152 virtual void OnDestruct() = 0; | 156 virtual void OnDestruct() = 0; |
| 153 }; | 157 }; |
| 154 | 158 |
| 155 // Gets the SequencedToken of the current thread. | 159 // Gets the SequencedToken of the current thread. |
| 156 // If current thread is not a SequencedWorkerPool worker thread or is running | 160 // If current thread is not a SequencedWorkerPool worker thread or is running |
| 157 // an unsequenced task, returns an invalid SequenceToken. | 161 // an unsequenced task, returns an invalid SequenceToken. |
| 158 static SequenceToken GetSequenceTokenForCurrentThread(); | 162 static SequenceToken GetSequenceTokenForCurrentThread(); |
| 159 | 163 |
| 164 // Returns the SequencedWorkerPool that owns this thread, or null if the |
| 165 // current thread is not a SequencedWorkerPool worker thread. |
| 166 static scoped_refptr<SequencedWorkerPool> GetWorkerPoolForCurrentThread(); |
| 167 |
| 160 // When constructing a SequencedWorkerPool, there must be a | 168 // When constructing a SequencedWorkerPool, there must be a |
| 161 // MessageLoop on the current thread unless you plan to deliberately | 169 // ThreadTaskRunnerHandle on the current thread unless you plan to |
| 162 // leak it. | 170 // deliberately leak it. |
| 163 | 171 |
| 164 // Pass the maximum number of threads (they will be lazily created as needed) | 172 // Pass the maximum number of threads (they will be lazily created as needed) |
| 165 // and a prefix for the thread name to aid in debugging. | 173 // and a prefix for the thread name to aid in debugging. |
| 166 SequencedWorkerPool(size_t max_threads, | 174 SequencedWorkerPool(size_t max_threads, |
| 167 const std::string& thread_name_prefix); | 175 const std::string& thread_name_prefix); |
| 168 | 176 |
| 169 // Like above, but with |observer| for testing. Does not take | 177 // Like above, but with |observer| for testing. Does not take ownership of |
| 170 // ownership of |observer|. | 178 // |observer|. |
| 171 SequencedWorkerPool(size_t max_threads, | 179 SequencedWorkerPool(size_t max_threads, |
| 172 const std::string& thread_name_prefix, | 180 const std::string& thread_name_prefix, |
| 173 TestingObserver* observer); | 181 TestingObserver* observer); |
| 174 | 182 |
| 175 // Returns a unique token that can be used to sequence tasks posted to | 183 // Returns a unique token that can be used to sequence tasks posted to |
| 176 // PostSequencedWorkerTask(). Valid tokens are always nonzero. | 184 // PostSequencedWorkerTask(). Valid tokens are always nonzero. |
| 177 SequenceToken GetSequenceToken(); | 185 SequenceToken GetSequenceToken(); |
| 178 | 186 |
| 179 // Returns the sequence token associated with the given name. Calling this | 187 // Returns the sequence token associated with the given name. Calling this |
| 180 // function multiple times with the same string will always produce the | 188 // function multiple times with the same string will always produce the |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 // Avoid pulling in too many headers by putting (almost) everything | 359 // Avoid pulling in too many headers by putting (almost) everything |
| 352 // into |inner_|. | 360 // into |inner_|. |
| 353 const scoped_ptr<Inner> inner_; | 361 const scoped_ptr<Inner> inner_; |
| 354 | 362 |
| 355 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool); | 363 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool); |
| 356 }; | 364 }; |
| 357 | 365 |
| 358 } // namespace base | 366 } // namespace base |
| 359 | 367 |
| 360 #endif // BASE_THREADING_SEQUENCED_WORKER_POOL_H_ | 368 #endif // BASE_THREADING_SEQUENCED_WORKER_POOL_H_ |
| OLD | NEW |