| Index: base/threading/sequenced_worker_pool_unittest.cc
|
| diff --git a/base/threading/sequenced_worker_pool_unittest.cc b/base/threading/sequenced_worker_pool_unittest.cc
|
| index 25736d068f00a6719736f98604eeff9e23c1f142..a7e9e93f86a0b6553b501cabcc80520f3411e332 100644
|
| --- a/base/threading/sequenced_worker_pool_unittest.cc
|
| +++ b/base/threading/sequenced_worker_pool_unittest.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/synchronization/lock.h"
|
| #include "base/threading/platform_thread.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| +#include "base/tracked_objects.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace base {
|
| @@ -143,9 +144,9 @@ class SequencedWorkerPoolTest : public testing::Test,
|
| public SequencedWorkerPool::TestingObserver {
|
| public:
|
| SequencedWorkerPoolTest()
|
| - : pool_(kNumWorkerThreads, "test"),
|
| + : pool_(new SequencedWorkerPool(kNumWorkerThreads, "test")),
|
| tracker_(new TestTracker) {
|
| - pool_.SetTestingObserver(this);
|
| + pool_->SetTestingObserver(this);
|
| }
|
| ~SequencedWorkerPoolTest() {
|
| }
|
| @@ -153,10 +154,10 @@ class SequencedWorkerPoolTest : public testing::Test,
|
| virtual void SetUp() {
|
| }
|
| virtual void TearDown() {
|
| - pool_.Shutdown();
|
| + pool_->Shutdown();
|
| }
|
|
|
| - SequencedWorkerPool& pool() { return pool_; }
|
| + const scoped_refptr<SequencedWorkerPool>& pool() { return pool_; }
|
| TestTracker* tracker() { return tracker_.get(); }
|
|
|
| // Ensures that the given number of worker threads is created by adding
|
| @@ -178,9 +179,9 @@ class SequencedWorkerPoolTest : public testing::Test,
|
| // workers to be created.
|
| ThreadBlocker blocker;
|
| for (size_t i = 0; i < kNumWorkerThreads; i++) {
|
| - pool().PostWorkerTask(FROM_HERE,
|
| - base::Bind(&TestTracker::BlockTask,
|
| - tracker(), -1, &blocker));
|
| + pool()->PostWorkerTask(FROM_HERE,
|
| + base::Bind(&TestTracker::BlockTask,
|
| + tracker(), -1, &blocker));
|
| }
|
| tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
|
|
|
| @@ -203,8 +204,8 @@ class SequencedWorkerPoolTest : public testing::Test,
|
| before_wait_for_shutdown_.Run();
|
| }
|
|
|
| - SequencedWorkerPool pool_;
|
| - scoped_refptr<TestTracker> tracker_;
|
| + const scoped_refptr<SequencedWorkerPool> pool_;
|
| + const scoped_refptr<TestTracker> tracker_;
|
| };
|
|
|
| // Checks that the given number of entries are in the tasks to complete of
|
| @@ -228,13 +229,13 @@ void EnsureTasksToCompleteCountAndUnblock(scoped_refptr<TestTracker> tracker,
|
| TEST_F(SequencedWorkerPoolTest, NamedTokens) {
|
| const std::string name1("hello");
|
| SequencedWorkerPool::SequenceToken token1 =
|
| - pool().GetNamedSequenceToken(name1);
|
| + pool()->GetNamedSequenceToken(name1);
|
|
|
| - SequencedWorkerPool::SequenceToken token2 = pool().GetSequenceToken();
|
| + SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
|
|
|
| const std::string name3("goodbye");
|
| SequencedWorkerPool::SequenceToken token3 =
|
| - pool().GetNamedSequenceToken(name3);
|
| + pool()->GetNamedSequenceToken(name3);
|
|
|
| // All 3 tokens should be different.
|
| EXPECT_FALSE(token1.Equals(token2));
|
| @@ -243,24 +244,24 @@ TEST_F(SequencedWorkerPoolTest, NamedTokens) {
|
|
|
| // Requesting the same name again should give the same value.
|
| SequencedWorkerPool::SequenceToken token1again =
|
| - pool().GetNamedSequenceToken(name1);
|
| + pool()->GetNamedSequenceToken(name1);
|
| EXPECT_TRUE(token1.Equals(token1again));
|
|
|
| SequencedWorkerPool::SequenceToken token3again =
|
| - pool().GetNamedSequenceToken(name3);
|
| + pool()->GetNamedSequenceToken(name3);
|
| EXPECT_TRUE(token3.Equals(token3again));
|
| }
|
|
|
| // Tests that posting a bunch of tasks (many more than the number of worker
|
| // threads) runs them all.
|
| TEST_F(SequencedWorkerPoolTest, LotsOfTasks) {
|
| - pool().PostWorkerTask(FROM_HERE,
|
| - base::Bind(&TestTracker::SlowTask, tracker(), 0));
|
| + pool()->PostWorkerTask(FROM_HERE,
|
| + base::Bind(&TestTracker::SlowTask, tracker(), 0));
|
|
|
| const size_t kNumTasks = 20;
|
| for (size_t i = 1; i < kNumTasks; i++) {
|
| - pool().PostWorkerTask(FROM_HERE,
|
| - base::Bind(&TestTracker::FastTask, tracker(), i));
|
| + pool()->PostWorkerTask(FROM_HERE,
|
| + base::Bind(&TestTracker::FastTask, tracker(), i));
|
| }
|
|
|
| std::vector<int> result = tracker()->WaitUntilTasksComplete(kNumTasks);
|
| @@ -274,9 +275,9 @@ TEST_F(SequencedWorkerPoolTest, Sequence) {
|
| const size_t kNumBackgroundTasks = kNumWorkerThreads - 1;
|
| ThreadBlocker background_blocker;
|
| for (size_t i = 0; i < kNumBackgroundTasks; i++) {
|
| - pool().PostWorkerTask(FROM_HERE,
|
| - base::Bind(&TestTracker::BlockTask,
|
| - tracker(), i, &background_blocker));
|
| + pool()->PostWorkerTask(FROM_HERE,
|
| + base::Bind(&TestTracker::BlockTask,
|
| + tracker(), i, &background_blocker));
|
| }
|
| tracker()->WaitUntilTasksBlocked(kNumBackgroundTasks);
|
|
|
| @@ -285,22 +286,22 @@ TEST_F(SequencedWorkerPoolTest, Sequence) {
|
| // is one worker thread free, the first task will start and then block, and
|
| // the second task should be waiting.
|
| ThreadBlocker blocker;
|
| - SequencedWorkerPool::SequenceToken token1 = pool().GetSequenceToken();
|
| - pool().PostSequencedWorkerTask(
|
| + SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken();
|
| + pool()->PostSequencedWorkerTask(
|
| token1, FROM_HERE,
|
| base::Bind(&TestTracker::BlockTask, tracker(), 100, &blocker));
|
| - pool().PostSequencedWorkerTask(
|
| + pool()->PostSequencedWorkerTask(
|
| token1, FROM_HERE,
|
| base::Bind(&TestTracker::FastTask, tracker(), 101));
|
| EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
|
|
|
| // Create another two tasks as above with a different token. These will be
|
| // blocked since there are no slots to run.
|
| - SequencedWorkerPool::SequenceToken token2 = pool().GetSequenceToken();
|
| - pool().PostSequencedWorkerTask(
|
| + SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
|
| + pool()->PostSequencedWorkerTask(
|
| token2, FROM_HERE,
|
| base::Bind(&TestTracker::FastTask, tracker(), 200));
|
| - pool().PostSequencedWorkerTask(
|
| + pool()->PostSequencedWorkerTask(
|
| token2, FROM_HERE,
|
| base::Bind(&TestTracker::FastTask, tracker(), 201));
|
| EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
|
| @@ -335,22 +336,22 @@ TEST_F(SequencedWorkerPoolTest, DiscardOnShutdown) {
|
| EnsureAllWorkersCreated();
|
| ThreadBlocker blocker;
|
| for (size_t i = 0; i < kNumWorkerThreads; i++) {
|
| - pool().PostWorkerTask(FROM_HERE,
|
| - base::Bind(&TestTracker::BlockTask,
|
| - tracker(), i, &blocker));
|
| + pool()->PostWorkerTask(FROM_HERE,
|
| + base::Bind(&TestTracker::BlockTask,
|
| + tracker(), i, &blocker));
|
| }
|
| tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
|
|
|
| // Create some tasks with different shutdown modes.
|
| - pool().PostWorkerTaskWithShutdownBehavior(
|
| + pool()->PostWorkerTaskWithShutdownBehavior(
|
| FROM_HERE,
|
| base::Bind(&TestTracker::FastTask, tracker(), 100),
|
| SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
|
| - pool().PostWorkerTaskWithShutdownBehavior(
|
| + pool()->PostWorkerTaskWithShutdownBehavior(
|
| FROM_HERE,
|
| base::Bind(&TestTracker::FastTask, tracker(), 101),
|
| SequencedWorkerPool::SKIP_ON_SHUTDOWN);
|
| - pool().PostWorkerTaskWithShutdownBehavior(
|
| + pool()->PostWorkerTaskWithShutdownBehavior(
|
| FROM_HERE,
|
| base::Bind(&TestTracker::FastTask, tracker(), 102),
|
| SequencedWorkerPool::BLOCK_SHUTDOWN);
|
| @@ -360,7 +361,7 @@ TEST_F(SequencedWorkerPoolTest, DiscardOnShutdown) {
|
| base::Bind(&EnsureTasksToCompleteCountAndUnblock,
|
| scoped_refptr<TestTracker>(tracker()), 0,
|
| &blocker, kNumWorkerThreads);
|
| - pool().Shutdown();
|
| + pool()->Shutdown();
|
|
|
| std::vector<int> result = tracker()->WaitUntilTasksComplete(4);
|
|
|
| @@ -378,7 +379,7 @@ TEST_F(SequencedWorkerPoolTest, DiscardOnShutdown) {
|
| TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) {
|
| EnsureAllWorkersCreated();
|
| ThreadBlocker blocker;
|
| - pool().PostWorkerTaskWithShutdownBehavior(
|
| + pool()->PostWorkerTaskWithShutdownBehavior(
|
| FROM_HERE,
|
| base::Bind(&TestTracker::BlockTask,
|
| tracker(), 0, &blocker),
|
| @@ -386,13 +387,13 @@ TEST_F(SequencedWorkerPoolTest, ContinueOnShutdown) {
|
| tracker()->WaitUntilTasksBlocked(1);
|
|
|
| // This should not block. If this test hangs, it means it failed.
|
| - pool().Shutdown();
|
| + pool()->Shutdown();
|
|
|
| // The task should not have completed yet.
|
| EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
|
|
|
| // Posting more tasks should fail.
|
| - EXPECT_FALSE(pool().PostWorkerTaskWithShutdownBehavior(
|
| + EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
|
| FROM_HERE, base::Bind(&TestTracker::FastTask, tracker(), 0),
|
| SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
|
|
|
|
|