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

Issue 709456 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner:
Closed: Sep 2017
Cc:
EstimatedDays: ----
NextAction: ----
OS: ----
Pri: 2
Type: Bug

Blocked on:
issue 717554



Sign in to add a comment

Data race in RE2::Init

Project Member Reported by ellyjo...@chromium.org, Apr 7 2017

Issue description

It seems that RE2::Init is not safe to call on multiple threads concurrently: https://uberchromegw.corp.google.com/i/chromium.memory/builders/Linux%20TSan%20Tests/builds/3813

ToolbarActionsBarUnitTest.ExtensionActionWantsToRunAppearance/0 (run #1):
[ RUN      ] ToolbarActionsBarUnitTest.ExtensionActionWantsToRunAppearance/0
Xlib:  extension "RANDR" missing on display ":99".
==================
WARNING: ThreadSanitizer: data race (pid=18449)
  Read of size 8 at 0x00000e0adba0 by thread T27 (mutexes: write M495531611257847544, write M494687186327715488):
    #0 re2::RE2::Init(re2::StringPiece const&, re2::RE2::Options const&) third_party/re2/src/re2/re2.cc:181:12 (unit_tests+0x5cc977a)
    #1 re2::RE2::RE2(char const*) third_party/re2/src/re2/re2.cc:108:3 (unit_tests+0x5cc95bd)
    #2 gpu::gles2::Program::ProcessLogInfo(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) gpu/command_buffer/service/program_manager.cc:544:23 (unit_tests+0xa13340d)
    #3 gpu::gles2::Program::UpdateLogInfo() gpu/command_buffer/service/program_manager.cc:573:9 (unit_tests+0xa1338a9)
    #4 gpu::gles2::Program::Update() gpu/command_buffer/service/program_manager.cc:703:3 (unit_tests+0xa13424f)
    #5 gpu::gles2::Program::Link(gpu::gles2::ShaderManager*, gpu::gles2::Program::VaryingsPackingOption, base::Callback<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) gpu/command_buffer/service/program_manager.cc:1397:5 (unit_tests+0xa138cf6)
    #6 gpu::gles2::GLES2DecoderImpl::DoLinkProgram(unsigned int) gpu/command_buffer/service/gles2_cmd_decoder.cc:8715:16 (unit_tests+0xa0d2d1a)
    #7 gpu::gles2::GLES2DecoderImpl::HandleLinkProgram(unsigned int, void const volatile*) gpu/command_buffer/service/gles2_cmd_decoder_autogen.h:2402:3 (unit_tests+0xa099259)
    #8 gpu::error::Error gpu::gles2::GLES2DecoderImpl::DoCommandsImpl<false>(unsigned int, void const volatile*, int, int*) gpu/command_buffer/service/gles2_cmd_decoder.cc:5274:18 (unit_tests+0xa0c5f2b)
    #9 gpu::gles2::GLES2DecoderImpl::DoCommands(unsigned int, void const volatile*, int, int*) gpu/command_buffer/service/gles2_cmd_decoder.cc:5326:12 (unit_tests+0xa0c54a4)
    #10 gpu::CommandParser::ProcessCommands(int) gpu/command_buffer/service/cmd_parser.cc:53:35 (unit_tests+0xa177691)
    #11 gpu::CommandExecutor::PutChanged() gpu/command_buffer/service/command_executor.cc:57:22 (unit_tests+0xa06e330)
    #12 gpu::InProcessCommandBuffer::PumpCommandsOnGpuThread() gpu/ipc/in_process_command_buffer.cc:234:14 (unit_tests+0x5df4aab)
    #13 Invoke<const base::WeakPtr<gpu::InProcessCommandBuffer> &> base/bind_internal.h:214:12 (unit_tests+0x5dfad37)
    #14 MakeItSo<void (gpu::InProcessCommandBuffer::*const &)(), const base::WeakPtr<gpu::InProcessCommandBuffer> &> base/bind_internal.h:305 (unit_tests+0x5dfad37)
    #15 RunImpl<void (gpu::InProcessCommandBuffer::*const &)(), const std::__1::tuple<base::WeakPtr<gpu::InProcessCommandBuffer> > &, 0> base/bind_internal.h:361 (unit_tests+0x5dfad37)
    #16 base::internal::Invoker<base::internal::BindState<void (gpu::InProcessCommandBuffer::*)(), base::WeakPtr<gpu::InProcessCommandBuffer> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x5dfad37)
    #17 Run base/callback.h:80:12 (unit_tests+0xa06d287)
    #18 gpu::CommandBufferService::Flush(int) gpu/command_buffer/service/command_buffer_service.cc:99 (unit_tests+0xa06d287)
    #19 gpu::InProcessCommandBuffer::FlushOnGpuThread(int) gpu/ipc/in_process_command_buffer.cc:561:20 (unit_tests+0x5df7c59)
    #20 Invoke<const base::WeakPtr<gpu::InProcessCommandBuffer> &, const int &> base/bind_internal.h:214:12 (unit_tests+0x5dfc52e)
    #21 MakeItSo<void (gpu::InProcessCommandBuffer::*const &)(int), const base::WeakPtr<gpu::InProcessCommandBuffer> &, const int &> base/bind_internal.h:305 (unit_tests+0x5dfc52e)
    #22 RunImpl<void (gpu::InProcessCommandBuffer::*const &)(int), const std::__1::tuple<base::WeakPtr<gpu::InProcessCommandBuffer>, int> &, 0, 1> base/bind_internal.h:361 (unit_tests+0x5dfc52e)
    #23 base::internal::Invoker<base::internal::BindState<void (gpu::InProcessCommandBuffer::*)(int), base::WeakPtr<gpu::InProcessCommandBuffer>, int>, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x5dfc52e)
    #24 Run base/callback.h:80:12 (unit_tests+0x5df79cf)
    #25 gpu::InProcessCommandBuffer::ProcessTasksOnGpuThread() gpu/ipc/in_process_command_buffer.cc:531 (unit_tests+0x5df79cf)
    #26 Invoke<const base::WeakPtr<gpu::InProcessCommandBuffer> &> base/bind_internal.h:214:12 (unit_tests+0x5dfad37)
    #27 MakeItSo<void (gpu::InProcessCommandBuffer::*const &)(), const base::WeakPtr<gpu::InProcessCommandBuffer> &> base/bind_internal.h:305 (unit_tests+0x5dfad37)
    #28 RunImpl<void (gpu::InProcessCommandBuffer::*const &)(), const std::__1::tuple<base::WeakPtr<gpu::InProcessCommandBuffer> > &, 0> base/bind_internal.h:361 (unit_tests+0x5dfad37)
    #29 base::internal::Invoker<base::internal::BindState<void (gpu::InProcessCommandBuffer::*)(), base::WeakPtr<gpu::InProcessCommandBuffer> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x5dfad37)
    #30 Run base/callback.h:91:12 (unit_tests+0x50a7d8c)
    #31 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base/debug/task_annotator.cc:59 (unit_tests+0x50a7d8c)
    #32 base::MessageLoop::RunTask(base::PendingTask*) base/message_loop/message_loop.cc:423:19 (unit_tests+0x4febf02)
    #33 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask) base/message_loop/message_loop.cc:434:5 (unit_tests+0x4fec4cd)
    #34 base::MessageLoop::DoWork() base/message_loop/message_loop.cc:527:13 (unit_tests+0x4fecca4)
    #35 base::MessagePumpDefault::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_default.cc:33:31 (unit_tests+0x4ff07f1)
    #36 base::MessageLoop::RunHandler() base/message_loop/message_loop.cc:387:10 (unit_tests+0x4feb9eb)
    #37 base::RunLoop::Run() base/run_loop.cc:37:10 (unit_tests+0x5021649)
    #38 base::Thread::Run(base::RunLoop*) base/threading/thread.cc:250:13 (unit_tests+0x505c259)
    #39 base::Thread::ThreadMain() base/threading/thread.cc:333:3 (unit_tests+0x505c4a4)
    #40 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (unit_tests+0x505462d)

  Previous write of size 8 at 0x00000e0adba0 by main thread:
    #0 operator() third_party/re2/src/re2/re2.cc:170:18 (unit_tests+0x5cccd67)
    #1 __invoke<(lambda at ../../third_party/re2/src/re2/re2.cc:169:30)> buildtools/third_party/libc++/trunk/include/__functional_base:365 (unit_tests+0x5cccd67)
    #2 __execute<> buildtools/third_party/libc++/trunk/include/mutex:505 (unit_tests+0x5cccd67)
    #3 operator() buildtools/third_party/libc++/trunk/include/mutex:497 (unit_tests+0x5cccd67)
    #4 void std::__1::__call_once_proxy<std::__1::tuple<re2::RE2::Init(re2::StringPiece const&, re2::RE2::Options const&)::$_0&&> >(void*) buildtools/third_party/libc++/trunk/include/mutex:533 (unit_tests+0x5cccd67)
    #5 std::__1::__call_once(unsigned long volatile&, void*, void (*)(void*)) buildtools/third_party/libc++/trunk/src/mutex.cpp:261:13 (libc++.so+0xbbf88)
    #6 call_once<(lambda at ../../third_party/re2/src/re2/re2.cc:169:30)> buildtools/third_party/libc++/trunk/include/mutex:550:9 (unit_tests+0x5cc9663)
    #7 re2::RE2::Init(re2::StringPiece const&, re2::RE2::Options const&) third_party/re2/src/re2/re2.cc:169 (unit_tests+0x5cc9663)
    #8 re2::RE2::RE2(char const*) third_party/re2/src/re2/re2.cc:108:3 (unit_tests+0x5cc95bd)
    #9 SupervisedUserURLFilter::SupervisedUserURLFilter() chrome/browser/supervised_user/supervised_user_url_filter.cc:237:7 (unit_tests+0x57f3d86)
    #10 SupervisedUserService::SupervisedUserService(Profile*) chrome/browser/supervised_user/supervised_user_service.cc:427:24 (unit_tests+0x57e92f2)
    #11 BuildInstanceFor chrome/browser/supervised_user/supervised_user_service_factory.cc:34:14 (unit_tests+0x57ee3ea)
    #12 SupervisedUserServiceFactory::BuildServiceInstanceFor(content::BrowserContext*) const chrome/browser/supervised_user/supervised_user_service_factory.cc:60 (unit_tests+0x57ee3ea)
    #13 BrowserContextKeyedServiceFactory::BuildServiceInstanceFor(base::SupportsUserData*) const components/keyed_service/content/browser_context_keyed_service_factory.cc:92:7 (unit_tests+0x6ee38cf)
    #14 KeyedServiceFactory::GetServiceForContext(base::SupportsUserData*, bool) components/keyed_service/core/keyed_service_factory.cc:89:15 (unit_tests+0x685bf6d)
    #15 BrowserContextKeyedServiceFactory::GetServiceForBrowserContext(content::BrowserContext*, bool) components/keyed_service/content/browser_context_keyed_service_factory.cc:45:31 (unit_tests+0x6ee374a)
    #16 SupervisedUserServiceFactory::GetForProfile(Profile*) chrome/browser/supervised_user/supervised_user_service_factory.cc:24:22 (unit_tests+0x57ee1f6)
    #17 SupervisedUserNavigationObserver::SupervisedUserNavigationObserver(content::WebContents*) chrome/browser/supervised_user/supervised_user_navigation_observer.cc:39:7 (unit_tests+0x57e1e72)
    #18 CreateForWebContents content/public/browser/web_contents_user_data.h:38:48 (unit_tests+0x756c8f3)
    #19 TabHelpers::AttachTabHelpers(content::WebContents*) chrome/browser/ui/tab_helpers.cc:276 (unit_tests+0x756c8f3)
    #20 AttachTabHelpers chrome/browser/ui/browser_navigator.cc:65:5 (unit_tests+0x75c1041)
    #21 CreateTargetContents chrome/browser/ui/browser_navigator.cc:384 (unit_tests+0x75c1041)
    #22 chrome::Navigate(chrome::NavigateParams*) chrome/browser/ui/browser_navigator.cc:531 (unit_tests+0x75c1041)
    #23 BrowserWithTestWindowTest::AddTab(Browser*, GURL const&) chrome/test/base/browser_with_test_window_test.cc:130:3 (unit_tests+0x1141c7e)
    #24 ToolbarActionsBarUnitTest_ExtensionActionWantsToRunAppearance_Test::TestBody() chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc:83:3 (unit_tests+0xf72a70)
    #25 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (unit_tests+0x4bad7ad)
    #26 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (unit_tests+0x4bad7ad)
    #27 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (unit_tests+0x4bae55d)
    #28 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (unit_tests+0x4baeca6)
    #29 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (unit_tests+0x4bb99a6)
    #30 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (unit_tests+0x4bb92d2)
    #31 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (unit_tests+0x4bb92d2)
    #32 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (unit_tests+0x416acb7)
    #33 base::TestSuite::Run() base/test/test_suite.cc:271 (unit_tests+0x416acb7)
    #34 content::UnitTestTestSuite::Run() content/public/test/unittest_test_suite.cc:45:23 (unit_tests+0x427b181)
    #35 Invoke<content::UnitTestTestSuite *> base/bind_internal.h:214:12 (unit_tests+0x4161485)
    #36 MakeItSo<int (content::UnitTestTestSuite::*const &)(), content::UnitTestTestSuite *> base/bind_internal.h:285 (unit_tests+0x4161485)
    #37 RunImpl<int (content::UnitTestTestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<content::UnitTestTestSuite> > &, 0> base/bind_internal.h:361 (unit_tests+0x4161485)
    #38 base::internal::Invoker<base::internal::BindState<int (content::UnitTestTestSuite::*)(), base::internal::UnretainedWrapper<content::UnitTestTestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x4161485)
    #39 Run base/callback.h:80:12 (unit_tests+0x416ccb5)
    #40 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:211 (unit_tests+0x416ccb5)
    #41 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:453:10 (unit_tests+0x416cb3a)
    #42 main chrome/test/base/run_all_unittests.cc:30:10 (unit_tests+0x41613bb)

  Location is global 're2::empty_string' of size 8 at 0x00000e0adba0 (unit_tests+0x00000e0adba0)

  Mutex M495531611257847544 is already destroyed.

  Mutex M494687186327715488 is already destroyed.

  Thread T27 'GpuThread' (tid=18611, running) created by main thread at:
    #0 pthread_create <null> (unit_tests+0x5b3dc5)
    #1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:110:13 (unit_tests+0x5054127)
    #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191:10 (unit_tests+0x5054025)
    #3 base::Thread::StartWithOptions(base::Thread::Options const&) base/threading/thread.cc:112:15 (unit_tests+0x505bcdf)
    #4 base::Thread::Start() base/threading/thread.cc:75:10 (unit_tests+0x505bb1b)
    #5 GpuInProcessThreadHolder gpu/ipc/in_process_command_buffer.cc:81:5 (unit_tests+0x5df3ff6)
    #6 New base/lazy_instance.h:61 (unit_tests+0x5df3ff6)
    #7 New base/lazy_instance.h:85 (unit_tests+0x5df3ff6)
    #8 Pointer base/lazy_instance.h:183 (unit_tests+0x5df3ff6)
    #9 Get base/lazy_instance.h:157 (unit_tests+0x5df3ff6)
    #10 GetInitialService gpu/ipc/in_process_command_buffer.cc:123 (unit_tests+0x5df3ff6)
    #11 gpu::InProcessCommandBuffer::InProcessCommandBuffer(scoped_refptr<gpu::InProcessCommandBuffer::Service> const&) gpu/ipc/in_process_command_buffer.cc:197 (unit_tests+0x5df3ff6)
    #12 Initialize gpu/ipc/gl_in_process_context.cc:132:29 (unit_tests+0x637c8a0)
    #13 gpu::GLInProcessContext::Create(scoped_refptr<gpu::InProcessCommandBuffer::Service>, scoped_refptr<gl::GLSurface>, bool, unsigned long, gpu::GLInProcessContext*, gpu::gles2::ContextCreationAttribHelper const&, gpu::SharedMemoryLimits const&, gpu::GpuMemoryBufferManager*, gpu::ImageFactory*, scoped_refptr<base::SingleThreadTaskRunner>) gpu/ipc/gl_in_process_context.cc:226 (unit_tests+0x637c8a0)
    #14 ui::InProcessContextProvider::BindToCurrentThread() ui/compositor/test/in_process_context_provider.cc:88:20 (unit_tests+0x9d1a90e)
    #15 ui::InProcessContextFactory::CreateCompositorFrameSink(base::WeakPtr<ui::Compositor>) ui/compositor/test/in_process_context_factory.cc:171:43 (unit_tests+0x9d174dd)
    #16 ui::Compositor::RequestNewCompositorFrameSink() ui/compositor/compositor.cc:487:23 (unit_tests+0x65051ba)
    #17 cc::LayerTreeHost::RequestNewCompositorFrameSink() cc/trees/layer_tree_host.cc:399:12 (unit_tests+0x6231ccf)
    #18 cc::SingleThreadProxy::RequestNewCompositorFrameSink() cc/trees/single_thread_proxy.cc:121:21 (unit_tests+0x627a880)
    #19 Invoke<const base::WeakPtr<cc::SingleThreadProxy> &> base/bind_internal.h:214:12 (unit_tests+0x627e697)
    #20 MakeItSo<void (cc::SingleThreadProxy::*const &)(), const base::WeakPtr<cc::SingleThreadProxy> &> base/bind_internal.h:305 (unit_tests+0x627e697)
    #21 RunImpl<void (cc::SingleThreadProxy::*const &)(), const std::__1::tuple<base::WeakPtr<cc::SingleThreadProxy> > &, 0> base/bind_internal.h:361 (unit_tests+0x627e697)
    #22 base::internal::Invoker<base::internal::BindState<void (cc::SingleThreadProxy::*)(), base::WeakPtr<cc::SingleThreadProxy> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x627e697)
    #23 Run base/callback.h:80:12 (unit_tests+0x128980d)
    #24 base::CancelableCallback<void ()>::Forward() const base/cancelable_callback.h:110 (unit_tests+0x128980d)
    #25 Invoke<const base::WeakPtr<base::CancelableCallback<void ()> > &> base/bind_internal.h:234:12 (unit_tests+0x12898b7)
    #26 MakeItSo<void (base::CancelableCallback<void ()>::*const &)() const, const base::WeakPtr<base::CancelableCallback<void ()> > &> base/bind_internal.h:305 (unit_tests+0x12898b7)
    #27 RunImpl<void (base::CancelableCallback<void ()>::*const &)() const, const std::__1::tuple<base::WeakPtr<base::CancelableCallback<void ()> > > &, 0> base/bind_internal.h:361 (unit_tests+0x12898b7)
    #28 base::internal::Invoker<base::internal::BindState<void (base::CancelableCallback<void ()>::*)() const, base::WeakPtr<base::CancelableCallback<void ()> > >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x12898b7)
    #29 Run base/callback.h:91:12 (unit_tests+0x50a7d8c)
    #30 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base/debug/task_annotator.cc:59 (unit_tests+0x50a7d8c)
    #31 base::MessageLoop::RunTask(base::PendingTask*) base/message_loop/message_loop.cc:423:19 (unit_tests+0x4febf02)
    #32 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask) base/message_loop/message_loop.cc:434:5 (unit_tests+0x4fec4cd)
    #33 base::MessageLoop::DoWork() base/message_loop/message_loop.cc:527:13 (unit_tests+0x4fecca4)
    #34 base::MessagePumpGlib::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_glib.cc:313:49 (unit_tests+0x4ff0e2b)
    #35 base::MessageLoop::RunHandler() base/message_loop/message_loop.cc:387:10 (unit_tests+0x4feb9eb)
    #36 base::RunLoop::Run() base/run_loop.cc:37:10 (unit_tests+0x5021649)
    #37 base::RunLoop::RunUntilIdle() base/run_loop.cc:45:3 (unit_tests+0x5021706)
    #38 extensions::extension_action_test_util::(anonymous namespace)::CreateToolbarModelImpl(Profile*, bool) chrome/browser/extensions/extension_action_test_util.cc:112:21 (unit_tests+0x9cf51f7)
    #39 extensions::extension_action_test_util::CreateToolbarModelForProfile(Profile*) chrome/browser/extensions/extension_action_test_util.cc:166:10 (unit_tests+0x9cf515e)
    #40 ToolbarActionsBarUnitTest::SetUp() chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.cc:110:7 (unit_tests+0x105b8b5)
    #41 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (unit_tests+0x4bad6b6)
    #42 testing::Test::Run() testing/gtest/src/gtest.cc:2470 (unit_tests+0x4bad6b6)
    #43 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (unit_tests+0x4bae55d)
    #44 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (unit_tests+0x4baeca6)
    #45 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (unit_tests+0x4bb99a6)
    #46 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (unit_tests+0x4bb92d2)
    #47 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (unit_tests+0x4bb92d2)
    #48 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (unit_tests+0x416acb7)
    #49 base::TestSuite::Run() base/test/test_suite.cc:271 (unit_tests+0x416acb7)
    #50 content::UnitTestTestSuite::Run() content/public/test/unittest_test_suite.cc:45:23 (unit_tests+0x427b181)
    #51 Invoke<content::UnitTestTestSuite *> base/bind_internal.h:214:12 (unit_tests+0x4161485)
    #52 MakeItSo<int (content::UnitTestTestSuite::*const &)(), content::UnitTestTestSuite *> base/bind_internal.h:285 (unit_tests+0x4161485)
    #53 RunImpl<int (content::UnitTestTestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<content::UnitTestTestSuite> > &, 0> base/bind_internal.h:361 (unit_tests+0x4161485)
    #54 base::internal::Invoker<base::internal::BindState<int (content::UnitTestTestSuite::*)(), base::internal::UnretainedWrapper<content::UnitTestTestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (unit_tests+0x4161485)
    #55 Run base/callback.h:80:12 (unit_tests+0x416ccb5)
    #56 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:211 (unit_tests+0x416ccb5)
    #57 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:453:10 (unit_tests+0x416cb3a)
    #58 main chrome/test/base/run_all_unittests.cc:30:10 (unit_tests+0x41613bb)

SUMMARY: ThreadSanitizer: data race third_party/re2/src/re2/re2.cc:181:12 in re2::RE2::Init(re2::StringPiece const&, re2::RE2::Options const&)

battre@, you seem like you have some experience with RE2 in our tree - can you take a peek?
 
Cc: bauerb@chromium.org jbau...@chromium.org
+cc jbauman as gpu owner
+cc bauerb as supervised user owner
Cc: battre@chromium.org
Owner: dvyukov@chromium.org
Dmitry, I saw that you maintain tsan. Could you take a look at this? It surprises me that the following code causes a race condition:

void RE2::Init(const StringPiece& pattern, const Options& options) {
  static std::once_flag empty_once;
  std::call_once(empty_once, []() {
    empty_string = new string;  // <- this is third_party/re2/src/re2/re2.cc:170
    empty_named_groups = new std::map<string, int>;
    empty_group_names = new std::map<int, string>;
  });

  pattern_ = pattern.ToString();
  options_.Copy(options);
  entire_regexp_ = NULL;
  suffix_regexp_ = NULL;
  prog_ = NULL;
  rprog_ = NULL;
  error_ = empty_string;  // <- this is third_party/re2/src/re2/re2.cc:181
  error_code_ = NoError;

I saw some comments that this might be a false positive.
- http://stackoverflow.com/questions/37587096/thread-sanitizer-reports-data-race-when-using-stdpackaged-task-stdexception 
- https://reviews.llvm.org/D24297?id=70536

Could you comment? Thanks.

Comment 3 by dvyukov@google.com, Apr 7 2017

Cc: glider@chromium.org thakis@chromium.org
+Nico, Alex

Do we use instrumented libc++ for tsan? I afraid it's a requirement (esp for synchronization primitives) because there is some synchronization in there.

The following would work:
static string* empty_string = new string;
But this is just a copy of upstream re2 so we are not free to change it, right?
We could add annotations, but it's no better than just changing the code to what tsan understands without instrumented libc++.

Comment 4 by dvyukov@google.com, Apr 7 2017

Owner: dvyukov@google.com
I think we use an instrumented libc++ for msan but not tsan. We want to, though.
Correct, we don't use instrumented libs for TSan.

Comment 8 by xlai@chromium.org, Apr 21 2017

Labels: -Pri-3 Pri-2
https://build.chromium.org/p/chromium.memory/builders/Linux%20TSan%20Tests/builds/4609

Seems to happen more frequently now.
This started to fail even more frequently recently:
https://build.chromium.org/p/chromium.memory/builders/Linux%20TSan%20Tests?numbuilds=100

We see 4 failures in the last 5 hours (the latest is https://build.chromium.org/p/chromium.memory/builders/Linux%20TSan%20Tests/builds/4836). All have exactly the same error message as above.

Comment 10 by kcc@chromium.org, Apr 28 2017

Cc: infe...@chromium.org kcc@chromium.org vitalyb...@chromium.org dvyukov@google.com
Owner: ----
Status: Available (was: Assigned)
I am afraid my team is not staffed for this work. 
We can poke at things like this just a bit, 
but migrating to tsan-instrumented libc++ is out of scope 
-- we simply have no one to work on it, sorry. 

Most likely the solution is to use tsan-instrumented libc++
I can reproduce with test like this:
#include "gtest/gtest.h"

#include <mutex>
#include <thread>

int x = 0;

void do_once() {
  static std::once_flag once;
  std::call_once(once, []() { ++x; });
  if (x == 7) abort();
}

TEST(CallOnce, CallOnce) {
  std::thread thread(&do_once);
  do_once();
  thread.join();
}

Also looks like libc++.so in Chromium build is already tsan instrumented.

Comment 13 by kcc@chromium.org, May 1 2017

That's a relief, thanks for checking! 
So, the fix is to roll newer libc++, right? 
Owner: thakis@chromium.org
I'll try rolling.
Blockedon: 717554
Labels: Stability-ThreadSanitizer
Project Member

Comment 17 by bugdroid1@chromium.org, May 24 2017

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

commit 2064d334c9817b83d54f945e03edd2c7e626b128
Author: thomasanderson <thomasanderson@chromium.org>
Date: Wed May 24 21:14:57 2017

Roll buildtools to 57c9408

This is needed to pick up:
https://codereview.chromium.org/2897463004
https://codereview.chromium.org/2848383002

CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_chromium_msan_rel_ng;master.tryserver.chromium.linux:linux_chromium_ubsan_rel_ng
BUG= 593874 , 709456 
R=thestig@chromium.org

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

[modify] https://crrev.com/2064d334c9817b83d54f945e03edd2c7e626b128/DEPS

Owner: thomasanderson@chromium.org
Status: Fixed (was: Available)
We think this is fixed, shout if that's not true.

Sign in to add a comment