diff options
author | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-11 22:42:29 +0000 |
---|---|---|
committer | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-11 22:42:29 +0000 |
commit | 497ec467bf9e18cd98675db8a74a170b82f0e755 (patch) | |
tree | 9a75392c704e55dc6c2426e247afe3c5e5cff7ef /base/threading/sequenced_worker_pool_unittest.cc | |
parent | faf06b03994d6a07f9799224d0732daed6919641 (diff) | |
download | chromium_src-497ec467bf9e18cd98675db8a74a170b82f0e755.zip chromium_src-497ec467bf9e18cd98675db8a74a170b82f0e755.tar.gz chromium_src-497ec467bf9e18cd98675db8a74a170b82f0e755.tar.bz2 |
Add SequencedWorkerPoolTaskRunner which lets you specify the shutdown behavior.
Update SequencedWorkerPoolSequencedTaskRunner to allow specifying the shutdown behavior too.
BUG=122458
TEST=trybots
Review URL: http://codereview.chromium.org/10021002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@131860 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/threading/sequenced_worker_pool_unittest.cc')
-rw-r--r-- | base/threading/sequenced_worker_pool_unittest.cc | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/base/threading/sequenced_worker_pool_unittest.cc b/base/threading/sequenced_worker_pool_unittest.cc index dcb9bff..42cf859 100644 --- a/base/threading/sequenced_worker_pool_unittest.cc +++ b/base/threading/sequenced_worker_pool_unittest.cc @@ -409,6 +409,12 @@ TEST_F(SequencedWorkerPoolTest, DiscardOnShutdown) { // Tests that CONTINUE_ON_SHUTDOWN tasks don't block shutdown. TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) { + scoped_refptr<TaskRunner> runner(pool()->GetTaskRunnerWithShutdownBehavior( + SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); + scoped_refptr<SequencedTaskRunner> sequenced_runner( + pool()->GetSequencedTaskRunnerWithShutdownBehavior( + pool()->GetSequenceToken(), + SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); EnsureAllWorkersCreated(); ThreadBlocker blocker; pool()->PostWorkerTaskWithShutdownBehavior( @@ -416,7 +422,16 @@ TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) { base::Bind(&TestTracker::BlockTask, tracker(), 0, &blocker), SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); - tracker()->WaitUntilTasksBlocked(1); + runner->PostTask( + FROM_HERE, + base::Bind(&TestTracker::BlockTask, + tracker(), 1, &blocker)); + sequenced_runner->PostTask( + FROM_HERE, + base::Bind(&TestTracker::BlockTask, + tracker(), 2, &blocker)); + + tracker()->WaitUntilTasksBlocked(3); // This should not block. If this test hangs, it means it failed. pool()->Shutdown(); @@ -428,11 +443,15 @@ TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) { EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior( FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0), SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)); + EXPECT_FALSE(runner->PostTask( + FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0))); + EXPECT_FALSE(sequenced_runner->PostTask( + FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0))); - // Continue the background thread and make sure the task can complete. - blocker.Unblock(1); - std::vector<int> result = tracker()->WaitUntilTasksComplete(1); - EXPECT_EQ(1u, result.size()); + // Continue the background thread and make sure the tasks can complete. + blocker.Unblock(3); + std::vector<int> result = tracker()->WaitUntilTasksComplete(3); + EXPECT_EQ(3u, result.size()); } // Ensure all worker threads are created, and then trigger a spurious @@ -535,6 +554,47 @@ INSTANTIATE_TYPED_TEST_CASE_P( SequencedWorkerPool, TaskRunnerTest, SequencedWorkerPoolTaskRunnerTestDelegate); +class SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate { + public: + SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate() {} + + ~SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate() { + } + + void StartTaskRunner() { + pool_owner_.reset( + new SequencedWorkerPoolOwner(10, "SequencedWorkerPoolTaskRunnerTest")); + task_runner_ = pool_owner_->pool()->GetTaskRunnerWithShutdownBehavior( + SequencedWorkerPool::BLOCK_SHUTDOWN); + } + + scoped_refptr<TaskRunner> GetTaskRunner() { + return task_runner_; + } + + void StopTaskRunner() { + pool_owner_->pool()->FlushForTesting(); + pool_owner_->pool()->Shutdown(); + // Don't reset |pool_owner_| here, as the test may still hold a + // reference to the pool. + } + + bool TaskRunnerHandlesNonZeroDelays() const { + // TODO(akalin): Set this to true once SequencedWorkerPool handles + // non-zero delays. + return false; + } + + private: + MessageLoop message_loop_; + scoped_ptr<SequencedWorkerPoolOwner> pool_owner_; + scoped_refptr<TaskRunner> task_runner_; +}; + +INSTANTIATE_TYPED_TEST_CASE_P( + SequencedWorkerPoolTaskRunner, TaskRunnerTest, + SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate); + class SequencedWorkerPoolSequencedTaskRunnerTestDelegate { public: SequencedWorkerPoolSequencedTaskRunnerTestDelegate() {} |