Chromium Code Reviews| Index: base/threading/worker_pool.cc |
| diff --git a/base/threading/worker_pool.cc b/base/threading/worker_pool.cc |
| index 56194d2d605d017d816239472a18673a59bc23b3..c0c7f3765322e6927834cd536425ad8f29fb6ee3 100644 |
| --- a/base/threading/worker_pool.cc |
| +++ b/base/threading/worker_pool.cc |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -6,6 +6,7 @@ |
| #include "base/bind.h" |
| #include "base/compiler_specific.h" |
| +#include "base/task_runner.h" |
| #include "base/threading/post_task_and_reply_impl.h" |
| #include "base/tracked_objects.h" |
| @@ -27,6 +28,86 @@ class PostTaskAndReplyWorkerPool : public internal::PostTaskAndReplyImpl { |
| bool task_is_slow_; |
| }; |
| +// WorkerPoolTaskRunner --------------------------------------------- |
| +// A TaskRunner which posts tasks to a WorkerPool with a |
| +// fixed ShutdownBehavior. |
| +// |
| +// Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
| +class WorkerPoolTaskRunner : public TaskRunner { |
| + public: |
| + WorkerPoolTaskRunner(bool tasks_are_slow); |
| + |
| + // TaskRunner implementation |
| + virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + int64 delay_ms) OVERRIDE; |
| + virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + TimeDelta delay) OVERRIDE; |
| + virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
| + |
| + private: |
| + virtual ~WorkerPoolTaskRunner(); |
| + |
| + // Helper function for posting a delayed task. Asserts that the delay is |
| + // zero because non-zero delays are not supported. |
| + bool PostDelayedTaskAssertZeroDelay( |
|
willchan no longer on Chromium
2012/04/24 23:41:50
Can you kill off one of these? You can do the conv
mattm
2012/04/25 00:57:35
Done.
|
| + const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + int64 delay_ms); |
| + bool PostDelayedTaskAssertZeroDelay( |
| + const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + TimeDelta delay); |
| + |
| + const bool tasks_are_slow_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(WorkerPoolTaskRunner); |
| +}; |
| + |
| +WorkerPoolTaskRunner::WorkerPoolTaskRunner(bool tasks_are_slow) |
| + : tasks_are_slow_(tasks_are_slow) { |
| +} |
| + |
| +WorkerPoolTaskRunner::~WorkerPoolTaskRunner() { |
| +} |
| + |
| +bool WorkerPoolTaskRunner::PostDelayedTask( |
| + const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + int64 delay_ms) { |
| + return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); |
| +} |
| + |
| +bool WorkerPoolTaskRunner::PostDelayedTask( |
| + const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + TimeDelta delay) { |
| + return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
| +} |
| + |
| +bool WorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
| + return WorkerPool::RunsTasksOnCurrentThread(); |
| +} |
| + |
| +bool WorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( |
| + const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + int64 delay_ms) { |
| + DCHECK_EQ(delay_ms, 0) |
| + << "WorkerPoolTaskRunner does not support non-zero delays"; |
| + return WorkerPool::PostTask(from_here, task, tasks_are_slow_); |
| +} |
| + |
| +bool WorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( |
| + const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + TimeDelta delay) { |
| + return PostDelayedTaskAssertZeroDelay(from_here, |
| + task, |
| + delay.InMillisecondsRoundedUp()); |
| +} |
| + |
| } // namespace |
| bool WorkerPool::PostTaskAndReply(const tracked_objects::Location& from_here, |
| @@ -37,4 +118,9 @@ bool WorkerPool::PostTaskAndReply(const tracked_objects::Location& from_here, |
| from_here, task, reply); |
| } |
| +// static |
| +scoped_refptr<TaskRunner> WorkerPool::GetTaskRunner(bool tasks_are_slow) { |
| + return new WorkerPoolTaskRunner(tasks_are_slow); |
| +} |
| + |
| } // namespace base |