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

Side by Side Diff: base/threading/sequenced_worker_pool.h

Issue 9401032: Make SequencedWorkerPool a TaskRunner (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated with changes from 9347056 Created 8 years, 10 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 | Annotate | Revision Log
OLDNEW
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 #pragma once 7 #pragma once
8 8
9 #include <cstddef> 9 #include <cstddef>
10 #include <list> 10 #include <list>
11 #include <map> 11 #include <map>
12 #include <set> 12 #include <set>
13 #include <string> 13 #include <string>
14 #include <vector> 14 #include <vector>
15 15
16 #include "base/atomicops.h" 16 #include "base/atomicops.h"
17 #include "base/base_export.h" 17 #include "base/base_export.h"
18 #include "base/basictypes.h" 18 #include "base/basictypes.h"
19 #include "base/callback.h" 19 #include "base/callback.h"
20 #include "base/compiler_specific.h"
20 #include "base/memory/linked_ptr.h" 21 #include "base/memory/linked_ptr.h"
21 #include "base/memory/ref_counted.h"
22 #include "base/synchronization/condition_variable.h" 22 #include "base/synchronization/condition_variable.h"
23 #include "base/synchronization/lock.h" 23 #include "base/synchronization/lock.h"
24 #include "base/task_runner.h"
24 #include "base/tracked_objects.h" 25 #include "base/tracked_objects.h"
25 26
26 namespace base { 27 namespace base {
27 28
28 // A worker thread pool that enforces ordering between sets of tasks. It also 29 // A worker thread pool that enforces ordering between sets of tasks. It also
29 // allows you to specify what should happen to your tasks on shutdown. 30 // allows you to specify what should happen to your tasks on shutdown.
30 // 31 //
31 // To enforce ordering, get a unique sequence token from the pool and post all 32 // To enforce ordering, get a unique sequence token from the pool and post all
32 // tasks you want to order with the token. All tasks with the same token are 33 // tasks you want to order with the token. All tasks with the same token are
33 // guaranteed to execute serially, though not necessarily on the same thread. 34 // guaranteed to execute serially, though not necessarily on the same thread.
(...skipping 14 matching lines...) Expand all
48 // 49 //
49 // This class is designed to be leaked on shutdown to allow the 50 // This class is designed to be leaked on shutdown to allow the
50 // CONTINUE_ON_SHUTDOWN behavior to be implemented. To enforce the 51 // CONTINUE_ON_SHUTDOWN behavior to be implemented. To enforce the
51 // BLOCK_SHUTDOWN behavior, you must call Shutdown() which will wait until 52 // BLOCK_SHUTDOWN behavior, you must call Shutdown() which will wait until
52 // the necessary tasks have completed. 53 // the necessary tasks have completed.
53 // 54 //
54 // Implementation note: This does not use a base::WorkerPool since that does 55 // Implementation note: This does not use a base::WorkerPool since that does
55 // not enforce shutdown semantics or allow us to specify how many worker 56 // not enforce shutdown semantics or allow us to specify how many worker
56 // threads to run. For the typical use case of random background work, we don't 57 // threads to run. For the typical use case of random background work, we don't
57 // necessarily want to be super aggressive about creating threads. 58 // necessarily want to be super aggressive about creating threads.
58 class BASE_EXPORT SequencedWorkerPool 59 //
59 : public RefCountedThreadSafe<SequencedWorkerPool> { 60 // Note that SequencedWorkerPool is RefCountedThreadSafe (inherited
61 // from TaskRunner).
62 class BASE_EXPORT SequencedWorkerPool : public TaskRunner {
60 public: 63 public:
61 // Defines what should happen to a task posted to the worker pool on shutdown. 64 // Defines what should happen to a task posted to the worker pool on shutdown.
62 enum WorkerShutdown { 65 enum WorkerShutdown {
63 // Tasks posted with this mode which have not run at shutdown will be 66 // Tasks posted with this mode which have not run at shutdown will be
64 // deleted rather than run, and any tasks with this mode running at 67 // deleted rather than run, and any tasks with this mode running at
65 // shutdown will be ignored (the worker thread will not be joined). 68 // shutdown will be ignored (the worker thread will not be joined).
66 // 69 //
67 // This option provides a nice way to post stuff you don't want blocking 70 // This option provides a nice way to post stuff you don't want blocking
68 // shutdown. For example, you might be doing a slow DNS lookup and if it's 71 // shutdown. For example, you might be doing a slow DNS lookup and if it's
69 // blocked on the OS, you may not want to stop shutdown, since the result 72 // blocked on the OS, you may not want to stop shutdown, since the result
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 const Closure& task); 191 const Closure& task);
189 192
190 // Same as PostSequencedWorkerTask but allows specification of the shutdown 193 // Same as PostSequencedWorkerTask but allows specification of the shutdown
191 // behavior. 194 // behavior.
192 bool PostSequencedWorkerTaskWithShutdownBehavior( 195 bool PostSequencedWorkerTaskWithShutdownBehavior(
193 SequenceToken sequence_token, 196 SequenceToken sequence_token,
194 const tracked_objects::Location& from_here, 197 const tracked_objects::Location& from_here,
195 const Closure& task, 198 const Closure& task,
196 WorkerShutdown shutdown_behavior); 199 WorkerShutdown shutdown_behavior);
197 200
201 // TaskRunner implementation. Forwards to PostWorkerTask().
202 virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
203 const Closure& task,
204 int64 delay_ms) OVERRIDE;
205 virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
206
198 // Blocks until all pending tasks are complete. This should only be called in 207 // Blocks until all pending tasks are complete. This should only be called in
199 // unit tests when you want to validate something that should have happened. 208 // unit tests when you want to validate something that should have happened.
200 // 209 //
201 // Note that calling this will not prevent other threads from posting work to 210 // Note that calling this will not prevent other threads from posting work to
202 // the queue while the calling thread is waiting on Flush(). In this case, 211 // the queue while the calling thread is waiting on Flush(). In this case,
203 // Flush will return only when there's no more work in the queue. Normally, 212 // Flush will return only when there's no more work in the queue. Normally,
204 // this doesn't come up sine in a test, all the work is being posted from 213 // this doesn't come up sine in a test, all the work is being posted from
205 // the main thread. 214 // the main thread.
206 void FlushForTesting(); 215 void FlushForTesting();
207 216
208 // Implements the worker pool shutdown. This should be called during app 217 // Implements the worker pool shutdown. This should be called during app
209 // shutdown, and will discard/join with appropriate tasks before returning. 218 // shutdown, and will discard/join with appropriate tasks before returning.
210 // After this call, subsequent calls to post tasks will fail. 219 // After this call, subsequent calls to post tasks will fail.
211 void Shutdown(); 220 void Shutdown();
212 221
213 // Called by tests to set the testing observer. This is NULL by default 222 // Called by tests to set the testing observer. This is NULL by default
214 // and ownership of the pointer is kept with the caller. 223 // and ownership of the pointer is kept with the caller.
215 void SetTestingObserver(TestingObserver* observer); 224 void SetTestingObserver(TestingObserver* observer);
216 225
226 protected:
227 virtual ~SequencedWorkerPool();
228
217 private: 229 private:
218 friend class RefCountedThreadSafe<SequencedWorkerPool>;
219 class Worker; 230 class Worker;
220 231
221 struct SequencedTask { 232 struct SequencedTask {
222 SequencedTask(); 233 SequencedTask();
223 ~SequencedTask(); 234 ~SequencedTask();
224 235
225 int sequence_token_id; 236 int sequence_token_id;
226 WorkerShutdown shutdown_behavior; 237 WorkerShutdown shutdown_behavior;
227 tracked_objects::Location location; 238 tracked_objects::Location location;
228 Closure task; 239 Closure task;
229 }; 240 };
230 241
231 ~SequencedWorkerPool();
232
233 // This function accepts a name and an ID. If the name is null, the 242 // This function accepts a name and an ID. If the name is null, the
234 // token ID is used. This allows us to implement the optional name lookup 243 // token ID is used. This allows us to implement the optional name lookup
235 // from a single function without having to enter the lock a separate time. 244 // from a single function without having to enter the lock a separate time.
236 bool PostTaskHelper(const std::string* optional_token_name, 245 bool PostTaskHelper(const std::string* optional_token_name,
237 SequenceToken sequence_token, 246 SequenceToken sequence_token,
238 WorkerShutdown shutdown_behavior, 247 WorkerShutdown shutdown_behavior,
239 const tracked_objects::Location& from_here, 248 const tracked_objects::Location& from_here,
240 const Closure& task); 249 const Closure& task);
241 250
242 // Runs the worker loop on the background thread. 251 // Runs the worker loop on the background thread.
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 bool shutdown_called_; 353 bool shutdown_called_;
345 354
346 TestingObserver* testing_observer_; 355 TestingObserver* testing_observer_;
347 356
348 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool); 357 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool);
349 }; 358 };
350 359
351 } // namespace base 360 } // namespace base
352 361
353 #endif // BASE_THREADING_SEQUENCED_WORKER_POOL_H_ 362 #endif // BASE_THREADING_SEQUENCED_WORKER_POOL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698