New issue
Advanced search Search tips

Issue 658766 link

Starred by 1 user

Issue metadata

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



Sign in to add a comment

ThreadSanitizer: data race base/threading/thread_local_storage.cc:299:9 in base::ThreadLocalStorage::StaticSlot::Free()

Project Member Reported by reillyg@chromium.org, Oct 24 2016

Issue description

First failing build: https://build.chromium.org/p/chromium.memory.full/builders/Linux%20TSan%20Tests/builds/2906

Suspect CL: https://chromiumcodereview.appspot.com/2429863002

Log:

MemoryDumpManagerTest.PostTaskForSequencedTaskRunner (run #1):
[ RUN      ] MemoryDumpManagerTest.PostTaskForSequencedTaskRunner
[14570:14570:1023/073600:25455694102:ERROR:memory_dump_manager.cc(524)] Disabling MemoryDumpProvider "TestDumpProvider". Failed to post task on the task runner provided.
==================
WARNING: ThreadSanitizer: data race (pid=14570)
  Write of size 4 at 0x7b5c00000634 by main thread:
    #0 base::ThreadLocalStorage::StaticSlot::Free() base/threading/thread_local_storage.cc:299:9 (base_unittests+0x000000cdeb86)
    #1 base::ThreadLocalStorage::Slot::~Slot() base/threading/thread_local_storage.cc:334:13 (base_unittests+0x000000cded49)
    #2 ~ThreadLocalPointer base/threading/thread_local.h:62:4 (base_unittests+0x000000d0a1e1)
    #3 ~ThreadLocalBoolean base/threading/thread_local.h:81 (base_unittests+0x000000d0a1e1)
    #4 base::trace_event::TraceLog::~TraceLog() base/trace_event/trace_log.cc:500 (base_unittests+0x000000d0a1e1)
    #5 base::trace_event::TraceLog::~TraceLog() base/trace_event/trace_log.cc:500:23 (base_unittests+0x000000d0a619)
    #6 Delete base/memory/singleton.h:60:5 (base_unittests+0x000000d110e5)
    #7 OnExit base/memory/singleton.h:274 (base_unittests+0x000000d110e5)
    #8 Delete base/trace_event/trace_log.cc:55 (base_unittests+0x000000d110e5)
    #9 base::trace_event::TraceLog::DeleteForTesting() base/trace_event/trace_log.cc:1701 (base_unittests+0x000000d110e5)
    #10 base::trace_event::MemoryDumpManagerTest::TearDown() base/trace_event/memory_dump_manager_unittest.cc:221:5 (base_unittests+0x000000b1937f)
    #11 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d793ee)
    #12 testing::Test::Run() testing/gtest/src/gtest.cc:2482 (base_unittests+0x000000d793ee)
    #13 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d7a20d)
    #14 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d7aae6)
    #15 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d83f46)
    #16 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d838f4)
    #17 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d838f4)
    #18 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d3a4a4)
    #19 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d3a4a4)
    #20 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d2d805)
    #21 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d2d805)
    #22 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d2d805)
    #23 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+0x000000d2d805)
    #24 Run base/callback.h:64:12 (base_unittests+0x000000d48c23)
    #25 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+0x000000d48c23)
    #26 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+0x000000d48aaa)
    #27 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d2d761)

  Previous read of size 4 at 0x7b5c00000634 by thread T3 (mutexes: write M3353):
    #0 Set base/threading/thread_local_storage.cc:325:12 (base_unittests+0x000000cdee3d)
    #1 base::ThreadLocalStorage::Slot::Set(void*) base/threading/thread_local_storage.cc:342 (base_unittests+0x000000cdee3d)
    #2 Set base/threading/thread_local.h:69:11 (base_unittests+0x000000d10ef9)
    #3 Set base/threading/thread_local.h:88 (base_unittests+0x000000d10ef9)
    #4 ~AutoThreadLocalBoolean base/trace_event/trace_log.cc:240 (base_unittests+0x000000d10ef9)
    #5 base::trace_event::TraceLog::UpdateTraceEventDuration(unsigned char const*, char const*, base::trace_event::TraceEventHandle) base/trace_event/trace_log.cc:1629 (base_unittests+0x000000d10ef9)
    #6 ~ScopedTracer base/trace_event/trace_event.h:1005:7 (base_unittests+0x000000cd4a07)
    #7 base::SequencedWorkerPool::Inner::ThreadLoop(base::SequencedWorkerPool::Worker*) base/threading/sequenced_worker_pool.cc:1034 (base_unittests+0x000000cd4a07)
    #8 base::SequencedWorkerPool::Worker::Run() base/threading/sequenced_worker_pool.cc:611:25 (base_unittests+0x000000cd3ed1)
    #9 base::SimpleThread::ThreadMain() base/threading/simple_thread.cc:68:3 (base_unittests+0x000000cd9612)
    #10 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (base_unittests+0x000000cd318d)

  Location is heap block of size 800 at 0x7b5c00000380 allocated by main thread:
    #0 operator new(unsigned long) <null> (base_unittests+0x00000051cce2)
    #1 New base/memory/singleton.h:55:12 (base_unittests+0x000000d09a95)
    #2 get base/memory/singleton.h:250 (base_unittests+0x000000d09a95)
    #3 base::trace_event::TraceLog::GetInstance() base/trace_event/trace_log.cc:461 (base_unittests+0x000000d09a95)
    #4 base::trace_event::MemoryDumpManager::Initialize(base::trace_event::MemoryDumpManagerDelegate*, bool) base/trace_event/memory_dump_manager.cc:230:37 (base_unittests+0x000000ceb66b)
    #5 InitializeMemoryDumpManager base/trace_event/memory_dump_manager_unittest.cc:237:11 (base_unittests+0x000000b09fb0)
    #6 base::trace_event::MemoryDumpManagerTest_PostTaskForSequencedTaskRunner_Test::TestBody() base/trace_event/memory_dump_manager_unittest.cc:539 (base_unittests+0x000000b09fb0)
    #7 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d792ec)
    #8 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d792ec)
    #9 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d7a20d)
    #10 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d7aae6)
    #11 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d83f46)
    #12 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d838f4)
    #13 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d838f4)
    #14 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d3a4a4)
    #15 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d3a4a4)
    #16 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d2d805)
    #17 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d2d805)
    #18 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d2d805)
    #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+0x000000d2d805)
    #20 Run base/callback.h:64:12 (base_unittests+0x000000d48c23)
    #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+0x000000d48c23)
    #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+0x000000d48aaa)
    #23 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d2d761)

  Mutex M3353 (0x7b5000001c08) created at:
    #0 pthread_mutex_init <null> (base_unittests+0x0000004bfa03)
    #1 base::internal::LockImpl::LockImpl() base/synchronization/lock_impl_posix.cc:45:8 (base_unittests+0x000000cb44fd)
    #2 Lock base/synchronization/lock.h:24:12 (base_unittests+0x000000cd709e)
    #3 Inner base/threading/sequenced_worker_pool.cc:638 (base_unittests+0x000000cd709e)
    #4 base::SequencedWorkerPool::SequencedWorkerPool(unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, base::TaskPriority) base/threading/sequenced_worker_pool.cc:1467 (base_unittests+0x000000cd709e)
    #5 TestSequencedTaskRunner base/trace_event/memory_dump_manager_unittest.cc:165:26 (base_unittests+0x000000b0a140)
    #6 base::trace_event::MemoryDumpManagerTest_PostTaskForSequencedTaskRunner_Test::TestBody() base/trace_event/memory_dump_manager_unittest.cc:544 (base_unittests+0x000000b0a140)
    #7 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d792ec)
    #8 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000d792ec)
    #9 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000d7a20d)
    #10 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000d7aae6)
    #11 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000d83f46)
    #12 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000d838f4)
    #13 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000d838f4)
    #14 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000d3a4a4)
    #15 base::TestSuite::Run() base/test/test_suite.cc:246 (base_unittests+0x000000d3a4a4)
    #16 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000d2d805)
    #17 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000d2d805)
    #18 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000d2d805)
    #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+0x000000d2d805)
    #20 Run base/callback.h:64:12 (base_unittests+0x000000d48c23)
    #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+0x000000d48c23)
    #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+0x000000d48aaa)
    #23 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000d2d761)

  Thread T3 'Test Task Runne' (tid=14602, running) created by thread T2 at:
    #0 pthread_create <null> (base_unittests+0x0000004be9f5)
    #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+0x000000cd2c87)
    #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191:10 (base_unittests+0x000000cd2b85)
    #3 base::SimpleThread::Start() base/threading/simple_thread.cc:35:13 (base_unittests+0x000000cd94c3)
    #4 base::SequencedWorkerPool::Worker::Worker(scoped_refptr<base::SequencedWorkerPool>, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) base/threading/sequenced_worker_pool.cc:587:3 (base_unittests+0x000000cd3d1f)
    #5 base::SequencedWorkerPool::Inner::FinishStartingAdditionalThread(int) base/threading/sequenced_worker_pool.cc:1388:7 (base_unittests+0x000000cd6121)
    #6 base::SequencedWorkerPool::Inner::PostTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, base::SequencedWorkerPool::SequenceToken, base::SequencedWorkerPool::WorkerShutdown, tracked_objects::Location const&, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, base::TimeDelta) base/threading/sequenced_worker_pool.cc:762:7 (base_unittests+0x000000cd5d2b)
    #7 base::SequencedWorkerPool::PostSequencedWorkerTask(base::SequencedWorkerPool::SequenceToken, tracked_objects::Location const&, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/threading/sequenced_worker_pool.cc:1552:18 (base_unittests+0x000000cd7c13)
    #8 base::trace_event::TestSequencedTaskRunner::PostDelayedTask(tracked_objects::Location const&, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, base::TimeDelta) base/trace_event/memory_dump_manager_unittest.cc:186:28 (base_unittests+0x000000b1f921)
    #9 base::TaskRunner::PostTask(tracked_objects::Location const&, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/task_runner.cc:45:10 (base_unittests+0x000000cbbdd3)
    #10 base::trace_event::MemoryDumpManager::SetupNextMemoryDump(std::__1::unique_ptr<base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState, std::__1::default_delete<base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState> >) base/trace_event/memory_dump_manager.cc:509:37 (base_unittests+0x000000cecc9c)
    #11 base::trace_event::MemoryDumpManager::InvokeOnMemoryDump(base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState*) base/trace_event/memory_dump_manager.cc:601:3 (base_unittests+0x000000ced867)
    #12 Invoke<base::trace_event::MemoryDumpManager *, base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState *> base/bind_internal.h:214:12 (base_unittests+0x000000cefea6)
    #13 MakeItSo<void (base::trace_event::MemoryDumpManager::*const &)(base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState *), base::trace_event::MemoryDumpManager *, base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState *> base/bind_internal.h:285 (base_unittests+0x000000cefea6)
    #14 RunImpl<void (base::trace_event::MemoryDumpManager::*const &)(base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState *), const std::__1::tuple<base::internal::UnretainedWrapper<base::trace_event::MemoryDumpManager>, base::internal::UnretainedWrapper<base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState> > &, 0, 1> base/bind_internal.h:361 (base_unittests+0x000000cefea6)
    #15 base::internal::Invoker<base::internal::BindState<void (base::trace_event::MemoryDumpManager::*)(base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState*), base::internal::UnretainedWrapper<base::trace_event::MemoryDumpManager>, base::internal::UnretainedWrapper<base::trace_event::MemoryDumpManager::ProcessMemoryDumpAsyncState> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000cefea6)
    #16 Run base/callback.h:64:12 (base_unittests+0x000000cd48ae)
    #17 base::SequencedWorkerPool::Inner::ThreadLoop(base::SequencedWorkerPool::Worker*) base/threading/sequenced_worker_pool.cc:1018 (base_unittests+0x000000cd48ae)
    #18 base::SequencedWorkerPool::Worker::Run() base/threading/sequenced_worker_pool.cc:611:25 (base_unittests+0x000000cd3ed1)
    #19 base::SimpleThread::ThreadMain() base/threading/simple_thread.cc:68:3 (base_unittests+0x000000cd9612)
    #20 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (base_unittests+0x000000cd318d)

SUMMARY: ThreadSanitizer: data race base/threading/thread_local_storage.cc:299:9 in base::ThreadLocalStorage::StaticSlot::Free()
 

Comment 1 by danakj@chromium.org, Oct 24 2016

Owner: fdoray@chromium.org
Labels: -Pri-3 Pri-1
Status: Assigned (was: Untriaged)
Since this is causing a bot to be red please let me know if you have a solution in the works or if you would like to revert your patch.
Project Member

Comment 4 by bugdroid1@chromium.org, Oct 25 2016

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/42bdd9c57551be778bfda66453cb6054d78dfdac

commit 42bdd9c57551be778bfda66453cb6054d78dfdac
Author: fdoray <fdoray@chromium.org>
Date: Tue Oct 25 02:46:00 2016

Use SequencedWorkerPoolOwner in MemoryDumpManagerTest.

MemoryDumpManagerTest didn't join its thread. This made a write in
TearDown() racy with a read from a thread created by the test.

With this CL, threads created by MemoryDumpManagerTest are joined
before TearDown() runs.

BUG= 658766 

Review-Url: https://codereview.chromium.org/2447853002
Cr-Commit-Position: refs/heads/master@{#427251}

[modify] https://crrev.com/42bdd9c57551be778bfda66453cb6054d78dfdac/base/test/sequenced_worker_pool_owner.cc
[modify] https://crrev.com/42bdd9c57551be778bfda66453cb6054d78dfdac/base/test/sequenced_worker_pool_owner.h
[modify] https://crrev.com/42bdd9c57551be778bfda66453cb6054d78dfdac/base/trace_event/memory_dump_manager_unittest.cc

Comment 5 by fdoray@chromium.org, Oct 25 2016

Status: Fixed (was: Assigned)

Sign in to add a comment