read-write race in FrustumPlanesType::Initialize
WARNING: ThreadSanitizer: data race (pid=72239)
Read of size 8 at 0x00011ef022c8 by thread T3:
#0 vtkPlane::SetNormal(double, double, double) vtkPlane.h:51 (libvtkCommonDataModel-9.3.9.3.dylib:arm64+0x870c14)
#1 vtkPlane::SetNormal(double const*) vtkPlane.h:51 (libvtkCommonDataModel-9.3.9.3.dylib:arm64+0x870dec)
#2 vtkPlanes::GetPlane(int, vtkPlane*) vtkPlanes.cxx:339 (libvtkCommonDataModel-9.3.9.3.dylib:arm64+0x8b2bc8)
#3 (anonymous namespace)::FrustumPlanesType::Initialize(vtkPlanes*) vtkFrustumSelector.cxx:86 (libvtkFiltersExtraction-9.3.9.3.dylib:arm64+0x2a2ffc)
#4 (anonymous namespace)::ComputeCellsInFrustumFunctor::Initialize() vtkFrustumSelector.cxx:120 (libvtkFiltersExtraction-9.3.9.3.dylib:arm64+0x2c7a90)
#5 vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::ComputeCellsInFrustumFunctor, true>::Execute(long long, long long) vtkSMPTools.h:111 (libvtkFiltersExtraction-9.3.9.3.dylib:arm64+0x2c79d8)
<snip>
Previous write of size 8 at 0x00011ef022c8 by thread T2:
#0 vtkPlane::SetNormal(double, double, double) vtkPlane.h:51 (libvtkCommonDataModel-9.3.9.3.dylib:arm64+0x870c94)
#1 vtkPlane::SetNormal(double const*) vtkPlane.h:51 (libvtkCommonDataModel-9.3.9.3.dylib:arm64+0x870dec)
#2 vtkPlanes::GetPlane(int, vtkPlane*) vtkPlanes.cxx:339 (libvtkCommonDataModel-9.3.9.3.dylib:arm64+0x8b2bc8)
#3 (anonymous namespace)::FrustumPlanesType::Initialize(vtkPlanes*) vtkFrustumSelector.cxx:86 (libvtkFiltersExtraction-9.3.9.3.dylib:arm64+0x2a2ffc)
#4 (anonymous namespace)::ComputeCellsInFrustumFunctor::Initialize() vtkFrustumSelector.cxx:120 (libvtkFiltersExtraction-9.3.9.3.dylib:arm64+0x2c7a90)
#5 vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::ComputeCellsInFrustumFunctor, true>::Execute(long long, long long) vtkSMPTools.h:111 (libvtkFiltersExtraction-9.3.9.3.dylib:arm64+0x2c79d8)
<snip>
I've debugged this, and I'm really not sure, but it looks to me like FrustumPlanesType::Initialize
is expected to be called only once:
(lldb) fr sel 8
frame #8: 0x0000000106b0b9dc libvtkFiltersExtraction-9.3.1.dylib`vtk::detail::smp::vtkSMPTools_FunctorInternal<(anonymous namespace)::ComputeCellsInFrustumFunctor, true>::Execute(this=0x000000016fdfc808, first=35, last=70) at vtkSMPTools.h:111:15
108 unsigned char& inited = this->Initialized.Local();
109 if (!inited)
110 {
-> 111 this->F.Initialize();
112 inited = 1;
113 }
114 this->F(first, last);
But in fact 2 threads are calling FrustumPlanesType::Initialize
simultaneously. I think that's the problem... but I'm not sure...
If that's normal, then FrustumPlanesType::Initialize
needs to change, because vtkPlanes::GetPlane(int, vtkPlane*)
is documented to mutate the given vtkPlane
.