New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 655953 link

Starred by 1 user

Issue metadata

Status: Fixed
Owner:
Closed: Oct 2016
Cc:
EstimatedDays: ----
NextAction: ----
OS: Linux
Pri: 2
Type: Bug



Sign in to add a comment

Data race in ActivityTrackerTest.ThreadDeathTest

Project Member Reported by glider@chromium.org, Oct 14 2016

Issue description

See 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/).
 
Project Member

Comment 1 by bugdroid1@chromium.org, 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

Project Member

Comment 2 by bugdroid1@chromium.org, 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

Status: Fixed (was: Assigned)

Sign in to add a comment