• Francois Doray's avatar
    [sequence_manager] Fix race in SequenceManagerPerfTest. · e2bfbf32
    Francois Doray authored
    Tests involving TaskScheduler accessed the members of
    SameThreadTaskSource from different threads without synchronization.
    This CL fixes the issue by making sure that the initial invocation of
    TestTask() happens on the same thread as other invocations.
    
    TSAN report before this CL:
    
    WARNING: ThreadSanitizer: data race (pid=126426)
      Write of size 4 at 0x7b1400001c0c by thread T4:
        #0 base::sequence_manager::SameThreadTaskSource::TestTask() base/task/sequence_manager/sequence_manager_perftest.cc:311:25
        #1 Invoke<void (base::sequence_manager::SameThreadTaskSource::*)(), base::sequence_manager::SameThreadTaskSource *> base/bind_internal.h:516:12
        #2 MakeItSo<void (base::sequence_manager::SameThreadTaskSource::*const &)(), base::sequence_manager::SameThreadTaskSource *> base/bind_internal.h:616
        #3 RunImpl<void (base::sequence_manager::SameThreadTaskSource::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::sequence_manager::SameThreadTaskSource> > &, 0> base/bind_internal.h:689
        #4 base::internal::Invoker<base::internal::BindState<void (base::sequence_manager::SameThreadTaskSource::*)(), base::internal::UnretainedWrapper<base::sequence_manager::SameThreadTaskSource> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:671
        #5 Run base/callback.h:99:12
        #6 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base/debug/task_annotator.cc:99
        #7 base::internal::TaskTracker::RunOrSkipTask(base::internal::Task, base::internal::Sequence*, bool) base/task/task_scheduler/task_tracker.cc:641:23
        #8 base::internal::TaskTrackerPosix::RunOrSkipTask(base::internal::Task, base::internal::Sequence*, bool) base/task/task_scheduler/task_tracker_posix.cc:23:16
        #9 base::internal::TaskTracker::RunAndPopNextTask(scoped_refptr<base::internal::Sequence>, base::internal::CanScheduleSequenceObserver*) base/task/task_scheduler/task_tracker.cc:496:3
        #10 base::internal::SchedulerWorker::RunWorker() base/task/task_scheduler/scheduler_worker.cc:333:24
        #11 base::internal::SchedulerWorker::RunSharedWorker() base/task/task_scheduler/scheduler_worker.cc:237:3
        #12 base::internal::SchedulerWorker::ThreadMain() base/task/task_scheduler/scheduler_worker.cc:207:7
        #13 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:81:13
    
      Previous write of size 4 at 0x7b1400001c0c by main thread:
        #0 TestTask base/task/sequence_manager/sequence_manager_perftest.cc:330:27
        #1 base::sequence_manager::SameThreadTaskSource::Start() base/task/sequence_manager/sequence_manager_perftest.cc:297
        #2 base::sequence_manager::SingleThreadImmediateTestCase::Start() base/task/sequence_manager/sequence_manager_perftest.cc:408:41
        #3 base::sequence_manager::SequenceManagerPerfTest::Benchmark(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, base::sequence_manager::TestCase*) base/task/sequence_manager/sequence_manager_perftest.cc:636:15
        #4 base::sequence_manager::SequenceManagerPerfTest_PostImmediateTasks_OneQueue_Test::TestBody() base/task/sequence_manager/sequence_manager_perftest.cc:714:3
        #5 HandleExceptionsInMethodIfSupported<testing::Test, void> third_party/googletest/src/googletest/src/gtest.cc
        #6 testing::Test::Run() third_party/googletest/src/googletest/src/gtest.cc:2522
        #7 testing::TestInfo::Run() third_party/googletest/src/googletest/src/gtest.cc:2703:11
        #8 testing::TestCase::Run() third_party/googletest/src/googletest/src/gtest.cc:2825:28
        #9 testing::internal::UnitTestImpl::RunAllTests() third_party/googletest/src/googletest/src/gtest.cc:5227:43
        #10 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> third_party/googletest/src/googletest/src/gtest.cc
        #11 testing::UnitTest::Run() third_party/googletest/src/googletest/src/gtest.cc:4835
        #12 RUN_ALL_TESTS third_party/googletest/src/googletest/include/gtest/gtest.h:2369:46
        #13 base::TestSuite::Run() base/test/test_suite.cc:294
        #14 main base/test/run_all_perftests.cc:8:42
    
    TSAN report after this CL:
      No races found.
    
    Change-Id: I03b816a01fe33eed86966f89cb1ad1b9ab34c2e3
    Reviewed-on: https://chromium-review.googlesource.com/c/1340534Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
    Commit-Queue: François Doray <fdoray@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#609276}
    e2bfbf32
sequence_manager_perftest.cc 25.7 KB