Data race in RE2::Init |
||||||||||
Issue descriptionIt 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?
,
Apr 7 2017
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.
,
Apr 7 2017
+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++.
,
Apr 7 2017
,
Apr 7 2017
I think we use an instrumented libc++ for msan but not tsan. We want to, though.
,
Apr 7 2017
Correct, we don't use instrumented libs for TSan.
,
Apr 21 2017
https://build.chromium.org/p/chromium.memory/builders/Linux%20TSan%20Tests/builds/4609 Seems to happen more frequently now.
,
Apr 26 2017
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.
,
Apr 28 2017
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++
,
Apr 29 2017
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.
,
Apr 29 2017
It was fixed with https://reviews.llvm.org/D24028 r280621, but Chromium uses old libcxx r256621 https://cs.chromium.org/chromium/src/buildtools/DEPS
,
May 1 2017
That's a relief, thanks for checking! So, the fix is to roll newer libc++, right?
,
May 1 2017
I'll try rolling.
,
May 2 2017
,
May 2 2017
,
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
,
Sep 14 2017
We think this is fixed, shout if that's not true. |
||||||||||
►
Sign in to add a comment |
||||||||||
Comment 1 by ellyjo...@chromium.org
, Apr 7 2017