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 <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include <cstddef> | 10 #include <cstddef> |
11 #include <memory> | 11 #include <memory> |
12 #include <string> | 12 #include <string> |
13 | 13 |
14 #include "base/base_export.h" | 14 #include "base/base_export.h" |
15 #include "base/callback_forward.h" | 15 #include "base/callback.h" |
16 #include "base/compiler_specific.h" | 16 #include "base/compiler_specific.h" |
17 #include "base/macros.h" | 17 #include "base/macros.h" |
18 #include "base/memory/ref_counted.h" | 18 #include "base/memory/ref_counted.h" |
19 #include "base/task_runner.h" | 19 #include "base/task_runner.h" |
20 #include "base/task_scheduler/task_traits.h" | 20 #include "base/task_scheduler/task_traits.h" |
21 | 21 |
22 namespace tracked_objects { | 22 namespace tracked_objects { |
23 class Location; | 23 class Location; |
24 } // namespace tracked_objects | 24 } // namespace tracked_objects |
25 | 25 |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 // tasks. Deleting those tasks before the previous one has completed could | 268 // tasks. Deleting those tasks before the previous one has completed could |
269 // cause nondeterministic crashes because the task could be keeping some | 269 // cause nondeterministic crashes because the task could be keeping some |
270 // objects alive which do work in their destructor, which could voilate the | 270 // objects alive which do work in their destructor, which could voilate the |
271 // assumptions of the running task. | 271 // assumptions of the running task. |
272 // | 272 // |
273 // The task will be guaranteed to run to completion before shutdown | 273 // The task will be guaranteed to run to completion before shutdown |
274 // (BLOCK_SHUTDOWN semantics). | 274 // (BLOCK_SHUTDOWN semantics). |
275 // | 275 // |
276 // Returns true if the task was posted successfully. This may fail during | 276 // Returns true if the task was posted successfully. This may fail during |
277 // shutdown regardless of the specified ShutdownBehavior. | 277 // shutdown regardless of the specified ShutdownBehavior. |
278 bool PostWorkerTask(const tracked_objects::Location& from_here, | 278 bool PostWorkerTask(const tracked_objects::Location& from_here, Closure task); |
279 const Closure& task); | |
280 | 279 |
281 // Same as PostWorkerTask but allows a delay to be specified (although doing | 280 // Same as PostWorkerTask but allows a delay to be specified (although doing |
282 // so changes the shutdown behavior). The task will be run after the given | 281 // so changes the shutdown behavior). The task will be run after the given |
283 // delay has elapsed. | 282 // delay has elapsed. |
284 // | 283 // |
285 // If the delay is nonzero, the task won't be guaranteed to run to completion | 284 // If the delay is nonzero, the task won't be guaranteed to run to completion |
286 // before shutdown (SKIP_ON_SHUTDOWN semantics) to avoid shutdown hangs. | 285 // before shutdown (SKIP_ON_SHUTDOWN semantics) to avoid shutdown hangs. |
287 // If the delay is zero, this behaves exactly like PostWorkerTask, i.e. the | 286 // If the delay is zero, this behaves exactly like PostWorkerTask, i.e. the |
288 // task will be guaranteed to run to completion before shutdown | 287 // task will be guaranteed to run to completion before shutdown |
289 // (BLOCK_SHUTDOWN semantics). | 288 // (BLOCK_SHUTDOWN semantics). |
290 bool PostDelayedWorkerTask(const tracked_objects::Location& from_here, | 289 bool PostDelayedWorkerTask(const tracked_objects::Location& from_here, |
291 const Closure& task, | 290 Closure task, |
292 TimeDelta delay); | 291 TimeDelta delay); |
293 | 292 |
294 // Same as PostWorkerTask but allows specification of the shutdown behavior. | 293 // Same as PostWorkerTask but allows specification of the shutdown behavior. |
295 bool PostWorkerTaskWithShutdownBehavior( | 294 bool PostWorkerTaskWithShutdownBehavior( |
296 const tracked_objects::Location& from_here, | 295 const tracked_objects::Location& from_here, |
297 const Closure& task, | 296 Closure task, |
298 WorkerShutdown shutdown_behavior); | 297 WorkerShutdown shutdown_behavior); |
299 | 298 |
300 // Like PostWorkerTask above, but provides sequencing semantics. This means | 299 // Like PostWorkerTask above, but provides sequencing semantics. This means |
301 // that tasks posted with the same sequence token (see GetSequenceToken()) | 300 // that tasks posted with the same sequence token (see GetSequenceToken()) |
302 // are guaranteed to execute in order. This is useful in cases where you're | 301 // are guaranteed to execute in order. This is useful in cases where you're |
303 // doing operations that may depend on previous ones, like appending to a | 302 // doing operations that may depend on previous ones, like appending to a |
304 // file. | 303 // file. |
305 // | 304 // |
306 // The task will be guaranteed to run to completion before shutdown | 305 // The task will be guaranteed to run to completion before shutdown |
307 // (BLOCK_SHUTDOWN semantics). | 306 // (BLOCK_SHUTDOWN semantics). |
308 // | 307 // |
309 // Returns true if the task was posted successfully. This may fail during | 308 // Returns true if the task was posted successfully. This may fail during |
310 // shutdown regardless of the specified ShutdownBehavior. | 309 // shutdown regardless of the specified ShutdownBehavior. |
311 bool PostSequencedWorkerTask(SequenceToken sequence_token, | 310 bool PostSequencedWorkerTask(SequenceToken sequence_token, |
312 const tracked_objects::Location& from_here, | 311 const tracked_objects::Location& from_here, |
313 const Closure& task); | 312 Closure task); |
314 | 313 |
315 // Like PostSequencedWorkerTask above, but allows you to specify a named | 314 // Like PostSequencedWorkerTask above, but allows you to specify a named |
316 // token, which saves an extra call to GetNamedSequenceToken. | 315 // token, which saves an extra call to GetNamedSequenceToken. |
317 bool PostNamedSequencedWorkerTask(const std::string& token_name, | 316 bool PostNamedSequencedWorkerTask(const std::string& token_name, |
318 const tracked_objects::Location& from_here, | 317 const tracked_objects::Location& from_here, |
319 const Closure& task); | 318 Closure task); |
320 | 319 |
321 // Same as PostSequencedWorkerTask but allows a delay to be specified | 320 // Same as PostSequencedWorkerTask but allows a delay to be specified |
322 // (although doing so changes the shutdown behavior). The task will be run | 321 // (although doing so changes the shutdown behavior). The task will be run |
323 // after the given delay has elapsed. | 322 // after the given delay has elapsed. |
324 // | 323 // |
325 // If the delay is nonzero, the task won't be guaranteed to run to completion | 324 // If the delay is nonzero, the task won't be guaranteed to run to completion |
326 // before shutdown (SKIP_ON_SHUTDOWN semantics) to avoid shutdown hangs. | 325 // before shutdown (SKIP_ON_SHUTDOWN semantics) to avoid shutdown hangs. |
327 // If the delay is zero, this behaves exactly like PostSequencedWorkerTask, | 326 // If the delay is zero, this behaves exactly like PostSequencedWorkerTask, |
328 // i.e. the task will be guaranteed to run to completion before shutdown | 327 // i.e. the task will be guaranteed to run to completion before shutdown |
329 // (BLOCK_SHUTDOWN semantics). | 328 // (BLOCK_SHUTDOWN semantics). |
330 bool PostDelayedSequencedWorkerTask( | 329 bool PostDelayedSequencedWorkerTask( |
331 SequenceToken sequence_token, | 330 SequenceToken sequence_token, |
332 const tracked_objects::Location& from_here, | 331 const tracked_objects::Location& from_here, |
333 const Closure& task, | 332 Closure task, |
334 TimeDelta delay); | 333 TimeDelta delay); |
335 | 334 |
336 // Same as PostSequencedWorkerTask but allows specification of the shutdown | 335 // Same as PostSequencedWorkerTask but allows specification of the shutdown |
337 // behavior. | 336 // behavior. |
338 bool PostSequencedWorkerTaskWithShutdownBehavior( | 337 bool PostSequencedWorkerTaskWithShutdownBehavior( |
339 SequenceToken sequence_token, | 338 SequenceToken sequence_token, |
340 const tracked_objects::Location& from_here, | 339 const tracked_objects::Location& from_here, |
341 const Closure& task, | 340 Closure task, |
342 WorkerShutdown shutdown_behavior); | 341 WorkerShutdown shutdown_behavior); |
343 | 342 |
344 // TaskRunner implementation. Forwards to PostDelayedWorkerTask(). | 343 // TaskRunner implementation. Forwards to PostDelayedWorkerTask(). |
345 bool PostDelayedTask(const tracked_objects::Location& from_here, | 344 bool PostDelayedTask(const tracked_objects::Location& from_here, |
346 const Closure& task, | 345 Closure task, |
347 TimeDelta delay) override; | 346 TimeDelta delay) override; |
348 bool RunsTasksOnCurrentThread() const override; | 347 bool RunsTasksOnCurrentThread() const override; |
349 | 348 |
350 // Blocks until all pending tasks are complete. This should only be called in | 349 // Blocks until all pending tasks are complete. This should only be called in |
351 // unit tests when you want to validate something that should have happened. | 350 // unit tests when you want to validate something that should have happened. |
352 // Does not wait for delayed tasks. If redirection to TaskScheduler is | 351 // Does not wait for delayed tasks. If redirection to TaskScheduler is |
353 // disabled, delayed tasks are deleted. If redirection to TaskScheduler is | 352 // disabled, delayed tasks are deleted. If redirection to TaskScheduler is |
354 // enabled, this will wait for all tasks posted to TaskScheduler (not just | 353 // enabled, this will wait for all tasks posted to TaskScheduler (not just |
355 // tasks posted to this SequencedWorkerPool). | 354 // tasks posted to this SequencedWorkerPool). |
356 // | 355 // |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 // Avoid pulling in too many headers by putting (almost) everything | 408 // Avoid pulling in too many headers by putting (almost) everything |
410 // into |inner_|. | 409 // into |inner_|. |
411 const std::unique_ptr<Inner> inner_; | 410 const std::unique_ptr<Inner> inner_; |
412 | 411 |
413 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool); | 412 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool); |
414 }; | 413 }; |
415 | 414 |
416 } // namespace base | 415 } // namespace base |
417 | 416 |
418 #endif // BASE_THREADING_SEQUENCED_WORKER_POOL_H_ | 417 #endif // BASE_THREADING_SEQUENCED_WORKER_POOL_H_ |
OLD | NEW |