Data race in ActivityTrackerTest.ThreadDeathTest |
||
Issue descriptionSee https://build.chromium.org/p/chromium.memory.full/builders/Linux%20TSan%20Tests/builds/2610/steps/base_unittests%20on%20Ubuntu-12.04/logs/stdio: [ RUN ] ActivityTrackerTest.ThreadDeathTest ================== WARNING: ThreadSanitizer: data race (pid=13061) Read of size 8 at 0x7b24000000e8 by main thread: #0 cache_used base/debug/activity_tracker.h:155:38 (base_unittests+0x0000005ca14b) #1 GetGlobalInactiveTrackerCount base/debug/activity_tracker_unittest.cc:77 (base_unittests+0x0000005ca14b) #2 base::debug::ActivityTrackerTest_ThreadDeathTest_Test::TestBody() base/debug/activity_tracker_unittest.cc:281 (base_unittests+0x0000005ca14b) #3 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d81d4c) #4 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d81d4c) #5 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d82c6d) #6 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d83546) #7 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d8c9a6) #8 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d8c354) #9 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d8c354) #10 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d42f04) #11 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d42f04) #12 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d37785) #13 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d37785) #14 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d37785) #15 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000d37785) #16 Run base/callback.h:64:12 (base_unittests+0x000000d51683) #17 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:210 (base_unittests+0x000000d51683) #18 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:452:10 (base_unittests+0x000000d5150a) #19 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d376e1) Previous write of size 8 at 0x7b24000000e8 by thread T3 (mutexes: write M2637): #0 base::debug::ActivityTrackerMemoryAllocator::GetObjectReference() base/debug/activity_tracker.cc:93:38 (base_unittests+0x000000c404cb) #1 base::debug::GlobalActivityTracker::CreateTrackerForCurrentThread() base/debug/activity_tracker.cc:589:47 (base_unittests+0x000000c4144e) #2 GetOrCreateTrackerForCurrentThread base/debug/activity_tracker.h:493:12 (base_unittests+0x0000005c4f41) #3 base::debug::SimpleActivityThread::Run() base/debug/activity_analyzer_unittest.cc:102 (base_unittests+0x0000005c4f41) #4 base::SimpleThread::ThreadMain() base/threading/simple_thread.cc:68:3 (base_unittests+0x000000ce3272) #5 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (base_unittests+0x000000cdcf0d) As if synchronized via sleep: #0 nanosleep <null> (base_unittests+0x0000004bc727) #1 base::PlatformThread::Sleep(base::TimeDelta) base/threading/platform_thread_posix.cc:178:10 (base_unittests+0x000000cdc833) #2 base::debug::SimpleActivityThread::WaitReady() base/debug/activity_analyzer_unittest.cc:124:5 (base_unittests+0x0000005c4879) #3 base::debug::ActivityTrackerTest_ThreadDeathTest_Test::TestBody() base/debug/activity_tracker_unittest.cc:279:6 (base_unittests+0x0000005c9fb2) #4 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d81d4c) #5 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d81d4c) #6 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d82c6d) #7 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d83546) #8 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d8c9a6) #9 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d8c354) #10 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d8c354) #11 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d42f04) #12 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d42f04) #13 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d37785) #14 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d37785) #15 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d37785) #16 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000d37785) #17 Run base/callback.h:64:12 (base_unittests+0x000000d51683) #18 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:210 (base_unittests+0x000000d51683) #19 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:452:10 (base_unittests+0x000000d5150a) #20 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d376e1) Location is heap block of size 136 at 0x7b2400000090 allocated by main thread: #0 operator new(unsigned long) <null> (base_unittests+0x00000051ceb2) #1 CreateWithAllocator base/debug/activity_tracker.cc:543:7 (base_unittests+0x000000c41881) #2 base::debug::GlobalActivityTracker::CreateWithLocalMemory(unsigned long, unsigned long, base::BasicStringPiece<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, int) base/debug/activity_tracker.cc:578 (base_unittests+0x000000c41881) #3 base::debug::ActivityTrackerTest_ThreadDeathTest_Test::TestBody() base/debug/activity_tracker_unittest.cc:257:3 (base_unittests+0x0000005c9782) #4 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d81d4c) #5 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d81d4c) #6 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d82c6d) #7 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d83546) #8 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d8c9a6) #9 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d8c354) #10 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d8c354) #11 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d42f04) #12 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d42f04) #13 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d37785) #14 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d37785) #15 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d37785) #16 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000d37785) #17 Run base/callback.h:64:12 (base_unittests+0x000000d51683) #18 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:210 (base_unittests+0x000000d51683) #19 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:452:10 (base_unittests+0x000000d5150a) #20 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d376e1) Mutex M2637 (0x7b24000000f0) created at: #0 pthread_mutex_init <null> (base_unittests+0x0000004bfbd3) #1 base::internal::LockImpl::LockImpl() base/synchronization/lock_impl_posix.cc:45:8 (base_unittests+0x000000cbd1fd) #2 Lock base/synchronization/lock.h:24:12 (base_unittests+0x000000c41970) #3 GlobalActivityTracker base/debug/activity_tracker.cc:633 (base_unittests+0x000000c41970) #4 CreateWithAllocator base/debug/activity_tracker.cc:543 (base_unittests+0x000000c41970) #5 base::debug::GlobalActivityTracker::CreateWithLocalMemory(unsigned long, unsigned long, base::BasicStringPiece<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, int) base/debug/activity_tracker.cc:578 (base_unittests+0x000000c41970) #6 base::debug::ActivityTrackerTest_ThreadDeathTest_Test::TestBody() base/debug/activity_tracker_unittest.cc:257:3 (base_unittests+0x0000005c9782) #7 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d81d4c) #8 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d81d4c) #9 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d82c6d) #10 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d83546) #11 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d8c9a6) #12 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d8c354) #13 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d8c354) #14 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d42f04) #15 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d42f04) #16 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d37785) #17 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d37785) #18 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d37785) #19 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000d37785) #20 Run base/callback.h:64:12 (base_unittests+0x000000d51683) #21 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:210 (base_unittests+0x000000d51683) #22 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:452:10 (base_unittests+0x000000d5150a) #23 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d376e1) Thread T3 't2/13080' (tid=13080, running) created by main thread at: #0 pthread_create <null> (base_unittests+0x0000004bebc5) #1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:110:13 (base_unittests+0x000000cdca07) #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191:10 (base_unittests+0x000000cdc905) #3 base::SimpleThread::Start() base/threading/simple_thread.cc:35:13 (base_unittests+0x000000ce3123) #4 base::debug::ActivityTrackerTest_ThreadDeathTest_Test::TestBody() base/debug/activity_tracker_unittest.cc:278:6 (base_unittests+0x0000005c9faa) #5 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d81d4c) #6 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d81d4c) #7 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d82c6d) #8 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d83546) #9 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d8c9a6) #10 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d8c354) #11 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d8c354) #12 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d42f04) #13 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d42f04) #14 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d37785) #15 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d37785) #16 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d37785) #17 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000d37785) #18 Run base/callback.h:64:12 (base_unittests+0x000000d51683) #19 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:210 (base_unittests+0x000000d51683) #20 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:452:10 (base_unittests+0x000000d5150a) #21 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d376e1) SUMMARY: ThreadSanitizer: data race base/debug/activity_tracker.h:155:38 in cache_used ================== [ OK ] ActivityTrackerTest.ThreadDeathTest (132 ms) This started showing up after https://codereview.chromium.org/2387733002/ (which I'm going to revert), but the offending code (base::debug::SimpleActivityThread::WaitReady()) has been introduced earlier (in https://codereview.chromium.org/2249683003/).
,
Oct 14 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/1164a42fe0c7f7646822e826597dd5299530f4e2 commit 1164a42fe0c7f7646822e826597dd5299530f4e2 Author: bcwhite <bcwhite@chromium.org> Date: Fri Oct 14 18:33:49 2016 Hold allocator lock while fetching 'used' count. Also: Use acquire/release for ready_ as suggested in post-commit comment: https://codereview.chromium.org/2249683003/ BUG= 655953 Review-Url: https://codereview.chromium.org/2422683002 Cr-Commit-Position: refs/heads/master@{#425395} [modify] https://crrev.com/1164a42fe0c7f7646822e826597dd5299530f4e2/base/debug/activity_analyzer_unittest.cc [modify] https://crrev.com/1164a42fe0c7f7646822e826597dd5299530f4e2/base/debug/activity_tracker_unittest.cc
,
Oct 20 2016
|
||
►
Sign in to add a comment |
||
Comment 1 by bugdroid1@chromium.org
, Oct 14 2016