`vtkStaticCellLocator::BuildLocatorInternal` data race found by TSan
I have a repro case in my own app, which I could reduce to something small if necessary, but maybe it will be obvious from the TSan output:
==================
WARNING: ThreadSanitizer: data race (pid=84848)
Write of size 4 at 0x7b94002996f4 by thread T72:
#0 int* std::__1::__fill_n<int*, int, long>(int*, int, long const&) fill_n.h:31 (Brainsight:x86_64+0x1068e666d)
#1 int* std::__1::fill_n<int*, int, long>(int*, int, long const&) fill_n.h:40 (Brainsight:x86_64+0x1068e649e)
#2 (anonymous namespace)::MapOffsets<int>::operator()(long long, long long) vtkStaticCellLocator.cxx:488 (Brainsight:x86_64+0x1068e634e)
#3 vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>::Execute(long long, long long) vtkSMPTools.h:97 (Brainsight:x86_64+0x1068e5c03)
#4 void vtk::detail::smp::ExecuteFunctorSTDThread<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false> >(void*, long long, long long, long long) vtkSMPToolsImpl.txx:47 (Brainsight:x86_64+0x1068e5e51)
#5 decltype(static_cast<void (*&>(fp)(static_cast<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*&>(fp0), static_cast<long long&>(fp0), static_cast<long long&>(fp0), static_cast<long long&>(fp0))) std::__1::__invoke<void (*&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*&, long long&, long long&, long long&>(void (*&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*&, long long&, long long&, long long&) type_traits:3918 (Brainsight:x86_64+0x1068eb7bb)
#6 std::__1::__bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<>, __is_valid_bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<> >::value>::type std::__1::__apply_functor<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, 0ul, 1ul, 2ul, 3ul, std::__1::tuple<> >(void (*&)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>&, std::__1::__tuple_indices<0ul, 1ul, 2ul, 3ul>, std::__1::tuple<>&&) bind.h:257 (Brainsight:x86_64+0x1068eb672)
#7 std::__1::__bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<>, __is_valid_bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<> >::value>::type std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>::operator()<>() bind.h:292 (Brainsight:x86_64+0x1068eb56e)
#8 decltype(static_cast<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&>(fp)()) std::__1::__invoke<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&>(std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&) type_traits:3918 (Brainsight:x86_64+0x1068eb483)
#9 void std::__1::__invoke_void_return_wrapper<void, true>::__call<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&>(std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&) invoke.h:61 (Brainsight:x86_64+0x1068eb39b)
#10 std::__1::__function::__alloc_func<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>, std::__1::allocator<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&> >, void ()>::operator()() function.h:178 (Brainsight:x86_64+0x1068eb31b)
#11 std::__1::__function::__func<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>, std::__1::allocator<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&> >, void ()>::operator()() function.h:352 (Brainsight:x86_64+0x1068e8617)
#12 std::__1::__function::__value_func<void ()>::operator()() const function.h:505 (Brainsight:x86_64+0x1027a0ae1)
#13 std::__1::function<void ()>::operator()() const function.h:1182 (Brainsight:x86_64+0x102797583)
#14 vtk::detail::smp::vtkSMPThreadPool::ThreadJob() vtkSMPThreadPool.cxx:80 (Brainsight:x86_64+0x10475c54c)
#15 decltype(*(static_cast<vtk::detail::smp::vtkSMPThreadPool*&>(fp0)).*fp()) std::__1::__invoke<void (vtk::detail::smp::vtkSMPThreadPool::*&)(), vtk::detail::smp::vtkSMPThreadPool*&, void>(void (vtk::detail::smp::vtkSMPThreadPool::*&)(), vtk::detail::smp::vtkSMPThreadPool*&) type_traits:3859 (Brainsight:x86_64+0x104764682)
#16 std::__1::__bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<>, __is_valid_bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<> >::value>::type std::__1::__apply_functor<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, 0ul, std::__1::tuple<> >(void (vtk::detail::smp::vtkSMPThreadPool::*&)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>&, std::__1::__tuple_indices<0ul>, std::__1::tuple<>&&) bind.h:257 (Brainsight:x86_64+0x10476456b)
#17 std::__1::__bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<>, __is_valid_bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<> >::value>::type std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>::operator()<>() bind.h:292 (Brainsight:x86_64+0x1047644be)
#18 decltype(static_cast<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>>(fp)()) std::__1::__invoke<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) type_traits:3918 (Brainsight:x86_64+0x104764363)
#19 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >&, std::__1::__tuple_indices<>) thread:287 (Brainsight:x86_64+0x1047641f3)
#20 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> > >(void*) thread:298 (Brainsight:x86_64+0x104762d59)
Previous write of size 4 at 0x7b94002996f4 by thread T52:
#0 int* std::__1::__fill_n<int*, int, long>(int*, int, long const&) fill_n.h:31 (Brainsight:x86_64+0x1068e666d)
#1 int* std::__1::fill_n<int*, int, long>(int*, int, long const&) fill_n.h:40 (Brainsight:x86_64+0x1068e649e)
#2 (anonymous namespace)::MapOffsets<int>::operator()(long long, long long) vtkStaticCellLocator.cxx:488 (Brainsight:x86_64+0x1068e634e)
#3 vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>::Execute(long long, long long) vtkSMPTools.h:97 (Brainsight:x86_64+0x1068e5c03)
#4 void vtk::detail::smp::ExecuteFunctorSTDThread<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false> >(void*, long long, long long, long long) vtkSMPToolsImpl.txx:47 (Brainsight:x86_64+0x1068e5e51)
#5 decltype(static_cast<void (*&>(fp)(static_cast<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*&>(fp0), static_cast<long long&>(fp0), static_cast<long long&>(fp0), static_cast<long long&>(fp0))) std::__1::__invoke<void (*&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*&, long long&, long long&, long long&>(void (*&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*&, long long&, long long&, long long&) type_traits:3918 (Brainsight:x86_64+0x1068eb7bb)
#6 std::__1::__bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<>, __is_valid_bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<> >::value>::type std::__1::__apply_functor<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, 0ul, 1ul, 2ul, 3ul, std::__1::tuple<> >(void (*&)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>&, std::__1::__tuple_indices<0ul, 1ul, 2ul, 3ul>, std::__1::tuple<>&&) bind.h:257 (Brainsight:x86_64+0x1068eb672)
#7 std::__1::__bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<>, __is_valid_bind_return<void (*)(void*, long long, long long, long long), std::__1::tuple<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long, long long, long long>, std::__1::tuple<> >::value>::type std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>::operator()<>() bind.h:292 (Brainsight:x86_64+0x1068eb56e)
#8 decltype(static_cast<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&>(fp)()) std::__1::__invoke<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&>(std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&) type_traits:3918 (Brainsight:x86_64+0x1068eb483)
#9 void std::__1::__invoke_void_return_wrapper<void, true>::__call<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&>(std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>&) invoke.h:61 (Brainsight:x86_64+0x1068eb39b)
#10 std::__1::__function::__alloc_func<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>, std::__1::allocator<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&> >, void ()>::operator()() function.h:178 (Brainsight:x86_64+0x1068eb31b)
#11 std::__1::__function::__func<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&>, std::__1::allocator<std::__1::__bind<void (&)(void*, long long, long long, long long), vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>*, long long&, long long&, long long&> >, void ()>::operator()() function.h:352 (Brainsight:x86_64+0x1068e8617)
#12 std::__1::__function::__value_func<void ()>::operator()() const function.h:505 (Brainsight:x86_64+0x1027a0ae1)
#13 std::__1::function<void ()>::operator()() const function.h:1182 (Brainsight:x86_64+0x102797583)
#14 vtk::detail::smp::vtkSMPThreadPool::ThreadJob() vtkSMPThreadPool.cxx:80 (Brainsight:x86_64+0x10475c54c)
#15 decltype(*(static_cast<vtk::detail::smp::vtkSMPThreadPool*&>(fp0)).*fp()) std::__1::__invoke<void (vtk::detail::smp::vtkSMPThreadPool::*&)(), vtk::detail::smp::vtkSMPThreadPool*&, void>(void (vtk::detail::smp::vtkSMPThreadPool::*&)(), vtk::detail::smp::vtkSMPThreadPool*&) type_traits:3859 (Brainsight:x86_64+0x104764682)
#16 std::__1::__bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<>, __is_valid_bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<> >::value>::type std::__1::__apply_functor<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, 0ul, std::__1::tuple<> >(void (vtk::detail::smp::vtkSMPThreadPool::*&)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>&, std::__1::__tuple_indices<0ul>, std::__1::tuple<>&&) bind.h:257 (Brainsight:x86_64+0x10476456b)
#17 std::__1::__bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<>, __is_valid_bind_return<void (vtk::detail::smp::vtkSMPThreadPool::*)(), std::__1::tuple<vtk::detail::smp::vtkSMPThreadPool*>, std::__1::tuple<> >::value>::type std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>::operator()<>() bind.h:292 (Brainsight:x86_64+0x1047644be)
#18 decltype(static_cast<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>>(fp)()) std::__1::__invoke<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) type_traits:3918 (Brainsight:x86_64+0x104764363)
#19 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >&, std::__1::__tuple_indices<>) thread:287 (Brainsight:x86_64+0x1047641f3)
#20 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> > >(void*) thread:298 (Brainsight:x86_64+0x104762d59)
Location is heap block of size 8404 at 0x7b9400299000 allocated by main thread:
#0 operator new(unsigned long) <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x82fbd)
#1 void* std::__1::__libcpp_operator_new<unsigned long>(unsigned long) new:235 (Brainsight:x86_64+0x10adb1fed)
#2 std::__1::__libcpp_allocate(unsigned long, unsigned long) new:261 (Brainsight:x86_64+0x10adb1d2a)
#3 std::__1::allocator<int>::allocate(unsigned long) allocator.h:108 (Brainsight:x86_64+0x10adb4b2c)
#4 std::__1::allocator_traits<std::__1::allocator<int> >::allocate(std::__1::allocator<int>&, unsigned long) allocator_traits.h:262 (Brainsight:x86_64+0x10adb467d)
#5 std::__1::vector<int, std::__1::allocator<int> >::__vallocate(unsigned long) vector:1015 (Brainsight:x86_64+0x10adb9f4d)
#6 std::__1::vector<int, std::__1::allocator<int> >::vector(unsigned long) vector:1148 (Brainsight:x86_64+0x1003478f9)
#7 std::__1::vector<int, std::__1::allocator<int> >::vector(unsigned long) vector:1142 (Brainsight:x86_64+0x10031831c)
#8 std::__1::__shared_ptr_emplace<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >::__shared_ptr_emplace<long long>(std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > >, long long&&) shared_ptr.h:298 (Brainsight:x86_64+0x1068da00a)
#9 std::__1::__shared_ptr_emplace<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >::__shared_ptr_emplace<long long>(std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > >, long long&&) shared_ptr.h:292 (Brainsight:x86_64+0x1068d97b3)
#10 std::__1::shared_ptr<std::__1::vector<int, std::__1::allocator<int> > > std::__1::allocate_shared<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > >, long long, void>(std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > const&, long long&&) shared_ptr.h:1106 (Brainsight:x86_64+0x1068d94b8)
#11 std::__1::shared_ptr<std::__1::vector<int, std::__1::allocator<int> > > std::__1::make_shared<std::__1::vector<int, std::__1::allocator<int> >, long long, void>(long long&&) shared_ptr.h:1115 (Brainsight:x86_64+0x1068d5d20)
#12 (anonymous namespace)::CellProcessor<int>::CellProcessor(vtkCellBinner*) vtkStaticCellLocator.cxx:327 (Brainsight:x86_64+0x1068d59e8)
#13 (anonymous namespace)::CellProcessor<int>::CellProcessor(vtkCellBinner*) vtkStaticCellLocator.cxx:321 (Brainsight:x86_64+0x1068767f3)
#14 vtkStaticCellLocator::BuildLocatorInternal() vtkStaticCellLocator.cxx:1549 (Brainsight:x86_64+0x10687617c)
#15 vtkStaticCellLocator::BuildLocator() vtkStaticCellLocator.cxx:1470 (Brainsight:x86_64+0x106874f25)
#16 -[BSStageView makeSurface:] BSStageView.mm:4017 (Brainsight:x86_64+0x10244976a)
#17 -[BSStageView makeReconstructions:] BSStageView.mm:4544 (Brainsight:x86_64+0x102453de7)
#18 -[BSStageView consumeReconstructionsMask] BSStageView.mm:10522 (Brainsight:x86_64+0x1024b55f5)
#19 -[BSStageView updateScene] BSStageView.mm:15522 (Brainsight:x86_64+0x10250ee66)
#20 -[BSStageView updateSceneAndRender] BSStageView.mm:2258 (Brainsight:x86_64+0x102426938)
#21 -[BSStageViewLayer drawInCGLContext:pixelFormat:forLayerTime:displayTime:] BSStageViewLayer.m:88 (Brainsight:x86_64+0x101020dc8)
#22 CAOpenGLLayerDraw(CAOpenGLLayer*, double, CVTimeStamp const*, unsigned int) <null>:2 (QuartzCore:x86_64+0xc25be)
#23 start <null>:2 (dyld:x86_64+0x552d)
Thread T72 (tid=17788019, running) created by main thread at:
#0 pthread_create <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x2df1f)
#1 std::__1::__libcpp_thread_create(_opaque_pthread_t**, void* (*)(void*), void*) __threading_support:421 (Brainsight:x86_64+0x104762c77)
#2 std::__1::thread::thread<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>, void>(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) thread:314 (Brainsight:x86_64+0x1047628a5)
#3 std::__1::thread::thread<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>, void>(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) thread:306 (Brainsight:x86_64+0x104762713)
#4 void std::__1::allocator<std::__1::thread>::construct<std::__1::thread, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::thread*, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) allocator.h:154 (Brainsight:x86_64+0x10476268f)
#5 void std::__1::allocator_traits<std::__1::allocator<std::__1::thread> >::construct<std::__1::thread, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>, void>(std::__1::allocator<std::__1::thread>&, std::__1::thread*, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) allocator_traits.h:290 (Brainsight:x86_64+0x10476246b)
#6 void std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::__construct_one_at_end<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) vector:948 (Brainsight:x86_64+0x1047620c4)
#7 void std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::emplace_back<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) vector:1706 (Brainsight:x86_64+0x10475c2ba)
#8 vtk::detail::smp::vtkSMPThreadPool::vtkSMPThreadPool(int) vtkSMPThreadPool.cxx:33 (Brainsight:x86_64+0x10475be81)
#9 vtk::detail::smp::vtkSMPThreadPool::vtkSMPThreadPool(int) vtkSMPThreadPool.cxx:29 (Brainsight:x86_64+0x10475c65f)
#10 void vtk::detail::smp::vtkSMPToolsImpl<(vtk::detail::smp::BackendType)1>::For<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false> >(long long, long long, long long, vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>&) vtkSMPToolsImpl.txx:80 (Brainsight:x86_64+0x1068e582d)
#11 void vtk::detail::smp::vtkSMPToolsAPI::For<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false> >(long long, long long, long long, vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>&) vtkSMPToolsAPI.h:114 (Brainsight:x86_64+0x1068e54a3)
#12 vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>::For(long long, long long, long long) vtkSMPTools.h:101 (Brainsight:x86_64+0x1068e52f3)
#13 void vtkSMPTools::For<(anonymous namespace)::MapOffsets<int> >(long long, long long, long long, (anonymous namespace)::MapOffsets<int>&) vtkSMPTools.h:246 (Brainsight:x86_64+0x1068e51ae)
#14 void vtkSMPTools::For<(anonymous namespace)::MapOffsets<int> >(long long, long long, (anonymous namespace)::MapOffsets<int>&) vtkSMPTools.h:270 (Brainsight:x86_64+0x106876a57)
#15 vtkStaticCellLocator::BuildLocatorInternal() vtkStaticCellLocator.cxx:1553 (Brainsight:x86_64+0x106876279)
#16 vtkStaticCellLocator::BuildLocator() vtkStaticCellLocator.cxx:1470 (Brainsight:x86_64+0x106874f25)
#17 -[BSStageView makeSurface:] BSStageView.mm:4017 (Brainsight:x86_64+0x10244976a)
#18 -[BSStageView makeReconstructions:] BSStageView.mm:4544 (Brainsight:x86_64+0x102453de7)
#19 -[BSStageView consumeReconstructionsMask] BSStageView.mm:10522 (Brainsight:x86_64+0x1024b55f5)
#20 -[BSStageView updateScene] BSStageView.mm:15522 (Brainsight:x86_64+0x10250ee66)
#21 -[BSStageView updateSceneAndRender] BSStageView.mm:2258 (Brainsight:x86_64+0x102426938)
#22 -[BSStageViewLayer drawInCGLContext:pixelFormat:forLayerTime:displayTime:] BSStageViewLayer.m:88 (Brainsight:x86_64+0x101020dc8)
#23 CAOpenGLLayerDraw(CAOpenGLLayer*, double, CVTimeStamp const*, unsigned int) <null>:2 (QuartzCore:x86_64+0xc25be)
#24 start <null>:2 (dyld:x86_64+0x552d)
Thread T52 (tid=17788020, finished) created by main thread at:
#0 pthread_create <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x2df1f)
#1 std::__1::__libcpp_thread_create(_opaque_pthread_t**, void* (*)(void*), void*) __threading_support:421 (Brainsight:x86_64+0x104762c77)
#2 std::__1::thread::thread<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>, void>(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) thread:314 (Brainsight:x86_64+0x1047628a5)
#3 std::__1::thread::thread<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>, void>(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) thread:306 (Brainsight:x86_64+0x104762713)
#4 void std::__1::allocator<std::__1::thread>::construct<std::__1::thread, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::thread*, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) allocator.h:154 (Brainsight:x86_64+0x10476268f)
#5 void std::__1::allocator_traits<std::__1::allocator<std::__1::thread> >::construct<std::__1::thread, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>, void>(std::__1::allocator<std::__1::thread>&, std::__1::thread*, std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) allocator_traits.h:290 (Brainsight:x86_64+0x10476246b)
#6 void std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::__construct_one_at_end<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) vector:948 (Brainsight:x86_64+0x1047620c4)
#7 void std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::emplace_back<std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*> >(std::__1::__bind<void (vtk::detail::smp::vtkSMPThreadPool::*)(), vtk::detail::smp::vtkSMPThreadPool*>&&) vector:1706 (Brainsight:x86_64+0x10475c2ba)
#8 vtk::detail::smp::vtkSMPThreadPool::vtkSMPThreadPool(int) vtkSMPThreadPool.cxx:33 (Brainsight:x86_64+0x10475be81)
#9 vtk::detail::smp::vtkSMPThreadPool::vtkSMPThreadPool(int) vtkSMPThreadPool.cxx:29 (Brainsight:x86_64+0x10475c65f)
#10 void vtk::detail::smp::vtkSMPToolsImpl<(vtk::detail::smp::BackendType)1>::For<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false> >(long long, long long, long long, vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>&) vtkSMPToolsImpl.txx:80 (Brainsight:x86_64+0x1068e582d)
#11 void vtk::detail::smp::vtkSMPToolsAPI::For<vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false> >(long long, long long, long long, vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>&) vtkSMPToolsAPI.h:114 (Brainsight:x86_64+0x1068e54a3)
#12 vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::MapOffsets<int>, false>::For(long long, long long, long long) vtkSMPTools.h:101 (Brainsight:x86_64+0x1068e52f3)
#13 void vtkSMPTools::For<(anonymous namespace)::MapOffsets<int> >(long long, long long, long long, (anonymous namespace)::MapOffsets<int>&) vtkSMPTools.h:246 (Brainsight:x86_64+0x1068e51ae)
#14 void vtkSMPTools::For<(anonymous namespace)::MapOffsets<int> >(long long, long long, (anonymous namespace)::MapOffsets<int>&) vtkSMPTools.h:270 (Brainsight:x86_64+0x106876a57)
#15 vtkStaticCellLocator::BuildLocatorInternal() vtkStaticCellLocator.cxx:1553 (Brainsight:x86_64+0x106876279)
#16 vtkStaticCellLocator::BuildLocator() vtkStaticCellLocator.cxx:1470 (Brainsight:x86_64+0x106874f25)
#17 -[BSStageView makeSurface:] BSStageView.mm:4017 (Brainsight:x86_64+0x10244976a)
#18 -[BSStageView makeReconstructions:] BSStageView.mm:4544 (Brainsight:x86_64+0x102453de7)
#19 -[BSStageView consumeReconstructionsMask] BSStageView.mm:10522 (Brainsight:x86_64+0x1024b55f5)
#20 -[BSStageView updateScene] BSStageView.mm:15522 (Brainsight:x86_64+0x10250ee66)
#21 -[BSStageView updateSceneAndRender] BSStageView.mm:2258 (Brainsight:x86_64+0x102426938)
#22 -[BSStageViewLayer drawInCGLContext:pixelFormat:forLayerTime:displayTime:] BSStageViewLayer.m:88 (Brainsight:x86_64+0x101020dc8)
#23 CAOpenGLLayerDraw(CAOpenGLLayer*, double, CVTimeStamp const*, unsigned int) <null>:2 (QuartzCore:x86_64+0xc25be)
#24 start <null>:2 (dyld:x86_64+0x552d)
SUMMARY: ThreadSanitizer: data race fill_n.h:31 in int* std::__1::__fill_n<int*, int, long>(int*, int, long const&)
==================
If I switch from vtkStaticCellLocator
to vtkCellLocator
the issue goes away.
Not sure if it matters, but I'm using the STDThread SMP backend.