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

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

Issue 2177373005: Revert "Allow SequencedTaskRunnerHandle::Get() while running unsequenced tasks." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge up to r408965 Created 4 years, 4 months 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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/message_loop/message_loop.h" 16 #include "base/message_loop/message_loop.h"
17 #include "base/sequence_checker_impl.h"
18 #include "base/stl_util.h" 17 #include "base/stl_util.h"
19 #include "base/synchronization/condition_variable.h" 18 #include "base/synchronization/condition_variable.h"
20 #include "base/synchronization/lock.h" 19 #include "base/synchronization/lock.h"
21 #include "base/synchronization/waitable_event.h"
22 #include "base/test/sequenced_task_runner_test_template.h" 20 #include "base/test/sequenced_task_runner_test_template.h"
23 #include "base/test/sequenced_worker_pool_owner.h" 21 #include "base/test/sequenced_worker_pool_owner.h"
24 #include "base/test/task_runner_test_template.h" 22 #include "base/test/task_runner_test_template.h"
25 #include "base/test/test_timeouts.h" 23 #include "base/test/test_timeouts.h"
26 #include "base/threading/platform_thread.h" 24 #include "base/threading/platform_thread.h"
27 #include "base/time/time.h" 25 #include "base/time/time.h"
28 #include "base/tracked_objects.h" 26 #include "base/tracked_objects.h"
29 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
30 28
31 namespace base { 29 namespace base {
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 // Should be fine to call on an idle instance with all threads created, and 888 // Should be fine to call on an idle instance with all threads created, and
891 // spamming the method shouldn't deadlock or confuse the class. 889 // spamming the method shouldn't deadlock or confuse the class.
892 pool()->FlushForTesting(); 890 pool()->FlushForTesting();
893 pool()->FlushForTesting(); 891 pool()->FlushForTesting();
894 892
895 // Should be fine to call after shutdown too. 893 // Should be fine to call after shutdown too.
896 pool()->Shutdown(); 894 pool()->Shutdown();
897 pool()->FlushForTesting(); 895 pool()->FlushForTesting();
898 } 896 }
899 897
900 // Helper method for VerifyCurrentSequencedTaskRunner() and 898 namespace {
901 // VerifyCurrentSequencedTaskRunnerForUnsequencedTask(). 899
902 void VerifySequencedTaskRunnerRunsOnCurrentThread( 900 void CheckWorkerPoolAndSequenceToken(
903 SequencedTaskRunner* task_runner, 901 const scoped_refptr<SequencedWorkerPool>& expected_pool,
904 bool should_run_on_current_thread, 902 SequencedWorkerPool::SequenceToken expected_token) {
905 const Closure& callback) { 903 SequencedWorkerPool::SequenceToken token =
906 EXPECT_EQ(should_run_on_current_thread, 904 SequencedWorkerPool::GetSequenceTokenForCurrentThread();
907 task_runner->RunsTasksOnCurrentThread()); 905 EXPECT_EQ(expected_token.ToString(), token.ToString());
908 callback.Run(); 906
907 scoped_refptr<SequencedWorkerPool> pool =
908 SequencedWorkerPool::GetWorkerPoolForCurrentThread();
909 EXPECT_EQ(expected_pool, pool);
909 } 910 }
910 911
911 void VerifyCurrentSequencedTaskRunner( 912 } // namespace
912 SequencedTaskRunner* expected_task_runner,
913 bool expected_equal,
914 const Closure& callback) {
915 scoped_refptr<SequencedTaskRunner> task_runner =
916 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
917 913
918 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); 914 TEST_F(SequencedWorkerPoolTest, GetWorkerPoolAndSequenceTokenForCurrentThread) {
919
920 // SequencedTaskRunner does not allow directly checking for equality, but we
921 // can post a task to one task runner and verify that the other task runner
922 // is on the same sequence.
923 task_runner->PostTask(
924 FROM_HERE,
925 Bind(&VerifySequencedTaskRunnerRunsOnCurrentThread,
926 base::Unretained(expected_task_runner), expected_equal, callback));
927 }
928
929 void VerifyCurrentSequencedTaskRunnerForUnsequencedTask(
930 SequencedWorkerPool* pool,
931 const Closure& callback) {
932 EXPECT_FALSE(
933 SequencedWorkerPool::GetSequenceTokenForCurrentThread().IsValid());
934
935 scoped_refptr<SequencedTaskRunner> task_runner =
936 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
937
938 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread());
939
940 scoped_refptr<SequencedTaskRunner> expected_task_runner =
941 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
942
943 // The pool should now be running a sequence. This also verifies that no other
944 // thread will start running tasks with this sequence token.
945 const SequencedWorkerPool::SequenceToken sequence_token =
946 SequencedWorkerPool::GetSequenceTokenForCurrentThread();
947 ASSERT_TRUE(sequence_token.IsValid());
948 EXPECT_TRUE(pool->IsRunningSequence(sequence_token));
949
950 // The two sequenced task runners should be the same. See
951 // VerifyCurrentSequencedTaskRunner() above for why the check is implemented
952 // this way.
953 const bool expected_equal = true;
954 task_runner->PostTask(FROM_HERE,
955 Bind(&VerifySequencedTaskRunnerRunsOnCurrentThread,
956 RetainedRef(std::move(expected_task_runner)),
957 expected_equal, callback));
958 }
959
960 TEST_F(SequencedWorkerPoolTest, GetSequencedTaskRunnerForCurrentThread) {
961 EnsureAllWorkersCreated(); 915 EnsureAllWorkersCreated();
962 916
963 // The current thread should not have a sequenced task runner from a 917 // The current thread should have neither a worker pool nor a sequence token.
964 // worker pool. 918 SequencedWorkerPool::SequenceToken local_token =
965 scoped_refptr<SequencedTaskRunner> local_task_runner = 919 SequencedWorkerPool::GetSequenceTokenForCurrentThread();
966 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread(); 920 scoped_refptr<SequencedWorkerPool> local_pool =
967 EXPECT_FALSE(local_task_runner); 921 SequencedWorkerPool::GetWorkerPoolForCurrentThread();
922 EXPECT_FALSE(local_token.IsValid()) << local_token.ToString();
923 EXPECT_FALSE(local_pool);
968 924
969 WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC, 925 SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken();
970 WaitableEvent::InitialState::NOT_SIGNALED); 926 SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
971 Closure signal = Bind(&WaitableEvent::Signal, Unretained(&event)); 927 pool()->PostSequencedWorkerTask(
972 scoped_refptr<SequencedTaskRunner> task_runner_1 = 928 token1, FROM_HERE,
973 pool()->GetSequencedTaskRunner(SequencedWorkerPool::GetSequenceToken()); 929 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), token1));
974 scoped_refptr<SequencedTaskRunner> task_runner_2 = 930 pool()->PostSequencedWorkerTask(
975 pool()->GetSequencedTaskRunner(SequencedWorkerPool::GetSequenceToken()); 931 token2, FROM_HERE,
976 task_runner_1->PostTask( 932 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(), token2));
977 FROM_HERE, Bind(&VerifyCurrentSequencedTaskRunner,
978 base::Unretained(task_runner_1.get()), true, signal));
979 event.Wait();
980 task_runner_2->PostTask(
981 FROM_HERE, Bind(&VerifyCurrentSequencedTaskRunner,
982 base::Unretained(task_runner_2.get()), true, signal));
983 event.Wait();
984 933
985 task_runner_1->PostTask( 934 pool()->PostWorkerTask(FROM_HERE,
986 FROM_HERE, Bind(&VerifyCurrentSequencedTaskRunner, 935 base::Bind(&CheckWorkerPoolAndSequenceToken, pool(),
987 base::Unretained(task_runner_2.get()), false, signal)); 936 SequencedWorkerPool::SequenceToken()));
988 event.Wait();
989 937
990 pool()->PostWorkerTask( 938 pool()->FlushForTesting();
991 FROM_HERE, Bind(&VerifyCurrentSequencedTaskRunnerForUnsequencedTask,
992 RetainedRef(pool()), signal));
993 event.Wait();
994 }
995
996 class ChecksSequenceOnDestruction
997 : public RefCountedThreadSafe<ChecksSequenceOnDestruction> {
998 public:
999 void DoNothing() {}
1000
1001 private:
1002 friend class RefCountedThreadSafe<ChecksSequenceOnDestruction>;
1003
1004 ~ChecksSequenceOnDestruction() {
1005 EXPECT_TRUE(sequence_checker_.CalledOnValidSequence());
1006 }
1007
1008 SequenceCheckerImpl sequence_checker_;
1009 };
1010
1011 void VerifySequenceOnDestruction(const Closure& callback) {
1012 scoped_refptr<SequencedTaskRunner> task_runner =
1013 SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
1014 scoped_refptr<ChecksSequenceOnDestruction> check_sequence(
1015 new ChecksSequenceOnDestruction);
1016
1017 // Post a task to an empty method. This will keep the only reference to the
1018 // object, so it will be destroyed right after running the task.
1019 task_runner->PostTask(FROM_HERE, Bind(&ChecksSequenceOnDestruction::DoNothing,
1020 std::move(check_sequence)));
1021
1022 // Post the callback afterwards, so we can be sure the first task completed.
1023 task_runner->PostTask(FROM_HERE, callback);
1024 }
1025
1026 TEST_F(SequencedWorkerPoolTest, CheckSequenceOnDestruction) {
1027 EnsureAllWorkersCreated();
1028
1029 WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
1030 WaitableEvent::InitialState::NOT_SIGNALED);
1031 Closure signal = Bind(&WaitableEvent::Signal, Unretained(&event));
1032 pool()->PostWorkerTask(FROM_HERE, Bind(&VerifySequenceOnDestruction, signal));
1033 event.Wait();
1034 } 939 }
1035 940
1036 TEST_F(SequencedWorkerPoolTest, ShutsDownCleanWithContinueOnShutdown) { 941 TEST_F(SequencedWorkerPoolTest, ShutsDownCleanWithContinueOnShutdown) {
1037 scoped_refptr<SequencedTaskRunner> task_runner = 942 scoped_refptr<SequencedTaskRunner> task_runner =
1038 pool()->GetSequencedTaskRunnerWithShutdownBehavior( 943 pool()->GetSequencedTaskRunnerWithShutdownBehavior(
1039 pool()->GetSequenceToken(), 944 pool()->GetSequenceToken(),
1040 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 945 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
1041 946
1042 // Upon test exit, should shut down without hanging. 947 // Upon test exit, should shut down without hanging.
1043 pool()->Shutdown(); 948 pool()->Shutdown();
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest, 1067 SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest,
1163 SequencedWorkerPoolSequencedTaskRunnerTestDelegate); 1068 SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
1164 INSTANTIATE_TYPED_TEST_CASE_P( 1069 INSTANTIATE_TYPED_TEST_CASE_P(
1165 SequencedWorkerPoolSequencedTaskRunner, 1070 SequencedWorkerPoolSequencedTaskRunner,
1166 SequencedTaskRunnerDelayedTest, 1071 SequencedTaskRunnerDelayedTest,
1167 SequencedWorkerPoolSequencedTaskRunnerTestDelegate); 1072 SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
1168 1073
1169 } // namespace 1074 } // namespace
1170 1075
1171 } // namespace base 1076 } // 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