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

Side by Side Diff: base/threading/sequenced_worker_pool_unittest.cc

Issue 1414793009: Allow SequencedTaskRunnerHandle::Get() while running unsequenced tasks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 5 years, 1 month 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
« no previous file with comments | « base/threading/sequenced_worker_pool.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "base/threading/sequenced_worker_pool.h" 5 #include "base/threading/sequenced_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 // Should be fine to call on an idle instance with all threads created, and 897 // Should be fine to call on an idle instance with all threads created, and
898 // spamming the method shouldn't deadlock or confuse the class. 898 // spamming the method shouldn't deadlock or confuse the class.
899 pool()->FlushForTesting(); 899 pool()->FlushForTesting();
900 pool()->FlushForTesting(); 900 pool()->FlushForTesting();
901 901
902 // Should be fine to call after shutdown too. 902 // Should be fine to call after shutdown too.
903 pool()->Shutdown(); 903 pool()->Shutdown();
904 pool()->FlushForTesting(); 904 pool()->FlushForTesting();
905 } 905 }
906 906
907 namespace { 907 // Helper method for VerifyCurrentSequencedTaskRunner().
908 908 void VerifySequencedTaskRunnerRunsOnCurrentThread(
909 void CheckWorkerPoolAndSequenceToken( 909 const scoped_refptr<SequencedTaskRunner>& task_runner) {
910 const scoped_refptr<SequencedWorkerPool>& expected_pool, 910 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread());
911 SequencedWorkerPool::SequenceToken expected_token) {
912 SequencedWorkerPool::SequenceToken token =
913 SequencedWorkerPool::GetSequenceTokenForCurrentThread();
914 EXPECT_EQ(expected_token.ToString(), token.ToString());
915
916 scoped_refptr<SequencedWorkerPool> pool =
917 SequencedWorkerPool::GetWorkerPoolForCurrentThread();
918 EXPECT_EQ(expected_pool, pool);
919 } 911 }
920 912
921 } // namespace 913 void VerifyCurrentSequencedTaskRunner(
914 scoped_refptr<SequencedTaskRunner> expected_task_runner) {
915 scoped_refptr<SequencedTaskRunner> task_runner =
916 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
922 917
923 TEST_F(SequencedWorkerPoolTest, GetWorkerPoolAndSequenceTokenForCurrentThread) { 918 // If the expected task runner is null, get another one for the current
919 // thread. They should be the same.
920 if (!expected_task_runner) {
921 expected_task_runner =
922 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
923 }
924
925 // SequencedTaskRunner does not allow directly checking for equality, but we
926 // can post a task to one task runner and verify that the other task runner
927 // is on the same sequence.
928 task_runner->PostTask(
929 FROM_HERE, base::Bind(&VerifySequencedTaskRunnerRunsOnCurrentThread,
930 expected_task_runner));
931 }
932
933 TEST_F(SequencedWorkerPoolTest, GetSequencedTaskRunnerForCurrentThread) {
924 EnsureAllWorkersCreated(); 934 EnsureAllWorkersCreated();
925 935
926 // The current thread should have neither a worker pool nor a sequence token. 936 // The current thread should not have a sequenced task runner from a
927 SequencedWorkerPool::SequenceToken local_token = 937 // worker pool.
928 SequencedWorkerPool::GetSequenceTokenForCurrentThread(); 938 scoped_refptr<SequencedTaskRunner> local_task_runner =
929 scoped_refptr<SequencedWorkerPool> local_pool = 939 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
930 SequencedWorkerPool::GetWorkerPoolForCurrentThread(); 940 EXPECT_FALSE(local_task_runner);
931 EXPECT_FALSE(local_token.IsValid()) << local_token.ToString();
932 EXPECT_FALSE(local_pool);
933 941
934 SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken(); 942 scoped_refptr<SequencedTaskRunner> task_runner_1 =
935 SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken(); 943 pool()->GetSequencedTaskRunner(SequencedWorkerPool::GetSequenceToken());
936 pool()->PostSequencedWorkerTask( 944 scoped_refptr<SequencedTaskRunner> task_runner_2 =
937 token1, FROM_HERE, 945 pool()->GetSequencedTaskRunner(SequencedWorkerPool::GetSequenceToken());
938 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), token1)); 946 task_runner_1->PostTask(
939 pool()->PostSequencedWorkerTask( 947 FROM_HERE, base::Bind(&VerifyCurrentSequencedTaskRunner, task_runner_1));
940 token2, FROM_HERE, 948 task_runner_2->PostTask(
941 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), token2)); 949 FROM_HERE, base::Bind(&VerifyCurrentSequencedTaskRunner, task_runner_2));
gab 2015/11/12 01:33:56 Would be nice to also verify inequality (i.e. task
Bernhard Bauer 2015/11/12 02:23:39 Done.
942 950
943 pool()->PostWorkerTask(FROM_HERE, 951 pool()->PostWorkerTask(
944 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), 952 FROM_HERE, base::Bind(&VerifyCurrentSequencedTaskRunner, nullptr));
945 SequencedWorkerPool::SequenceToken()));
946 953
947 pool()->FlushForTesting(); 954 pool()->FlushForTesting();
gab 2015/11/12 01:33:56 This seems risky as if the PostTask on 928 posts t
Bernhard Bauer 2015/11/12 02:23:39 Done.
955 pool()->Shutdown();
948 } 956 }
949 957
950 TEST(SequencedWorkerPoolRefPtrTest, ShutsDownCleanWithContinueOnShutdown) { 958 TEST(SequencedWorkerPoolRefPtrTest, ShutsDownCleanWithContinueOnShutdown) {
951 MessageLoop loop; 959 MessageLoop loop;
952 scoped_refptr<SequencedWorkerPool> pool(new SequencedWorkerPool(3, "Pool")); 960 scoped_refptr<SequencedWorkerPool> pool(new SequencedWorkerPool(3, "Pool"));
953 scoped_refptr<SequencedTaskRunner> task_runner = 961 scoped_refptr<SequencedTaskRunner> task_runner =
954 pool->GetSequencedTaskRunnerWithShutdownBehavior( 962 pool->GetSequencedTaskRunnerWithShutdownBehavior(
955 pool->GetSequenceToken(), 963 pool->GetSequenceToken(),
956 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 964 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
957 965
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest, 1086 SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest,
1079 SequencedWorkerPoolSequencedTaskRunnerTestDelegate); 1087 SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
1080 INSTANTIATE_TYPED_TEST_CASE_P( 1088 INSTANTIATE_TYPED_TEST_CASE_P(
1081 SequencedWorkerPoolSequencedTaskRunner, 1089 SequencedWorkerPoolSequencedTaskRunner,
1082 SequencedTaskRunnerDelayedTest, 1090 SequencedTaskRunnerDelayedTest,
1083 SequencedWorkerPoolSequencedTaskRunnerTestDelegate); 1091 SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
1084 1092
1085 } // namespace 1093 } // namespace
1086 1094
1087 } // namespace base 1095 } // namespace base
OLDNEW
« no previous file with comments | « base/threading/sequenced_worker_pool.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698