vtkProbeFilter read-write race found by TSan
WARNING: ThreadSanitizer: data race (pid=11974)
Read of size 1 at 0x000126d157d5 by thread T9:
#0 vtkProbeFilter::ProbeImagePointsInCell(vtkGenericCell*, long long, vtkDataSet*, int, double const*, double const*, int const*, vtkPointData*, char*, double*) vtkProbeFilter.cxx:840 (libvtkFiltersCore-9.3.9.3.dylib:arm64+0x15078e8)
#1 vtkProbeFilter::ProbeImageDataWorklet::operator()(long long, long long) vtkProbeFilter.cxx:926 (libvtkFiltersCore-9.3.9.3.dylib:arm64+0x1524118)
#2 vtk::detail::smp::vtkSMPTools_FunctorInternal<vtkProbeFilter::ProbeImageDataWorklet, true>::Execute(long long, long long) vtkSMPTools.h:114 (libvtkFiltersCore-9.3.9.3.dylib:arm64+0x1523d4c)
<snip>
Previous write of size 1 at 0x000126d157d5 by thread T10:
#0 vtkProbeFilter::ProbeImagePointsInCell(vtkGenericCell*, long long, vtkDataSet*, int, double const*, double const*, int const*, vtkPointData*, char*, double*) vtkProbeFilter.cxx:867 (libvtkFiltersCore-9.3.9.3.dylib:arm64+0x1507b48)
#1 vtkProbeFilter::ProbeImageDataWorklet::operator()(long long, long long) vtkProbeFilter.cxx:926 (libvtkFiltersCore-9.3.9.3.dylib:arm64+0x1524118)
#2 vtk::detail::smp::vtkSMPTools_FunctorInternal<vtkProbeFilter::ProbeImageDataWorklet, true>::Execute(long long, long long) vtkSMPTools.h:114 (libvtkFiltersCore-9.3.9.3.dylib:arm64+0x1523d4c)
<snip>
Some debugging:
(lldb) fr sel 3
frame #3: 0x0000000119f9f8ec libvtkFiltersCore-9.3.1.dylib`vtkProbeFilter::ProbeImagePointsInCell(this=0x0000000123603180, cell=0x0000000122130c80, cellId=597, source=0x0000000122602f40, srcBlockId=0, start=0x000000016fdf9a10, spacing=0x000000016fdf9a50, dim=0x000000016fdf9a2c, outPD=0x0000000122632f80, maskArray="", wtsBuff=0x000000012180de80) at vtkProbeFilter.cxx:840:13
837 {
838 // skip processed points
839 const vtkIdType ptId = ix + dim[0] * (iy + dim[1] * iz);
-> 840 if (maskArray[ptId] == 1)
841 {
842 continue;
843 }
(lldb) fr sel 4
frame #4: 0x0000000119fbc11c libvtkFiltersCore-9.3.1.dylib`vtkProbeFilter::ProbeImageDataWorklet::operator()(this=0x000000016fdf9938, cellBegin=539, cellEnd=616) at vtkProbeFilter.cxx:926:26
923 continue;
924 }
925
-> 926 this->ProbeFilter->ProbeImagePointsInCell(cell, cellId, this->Source, this->SrcBlockId,
927 this->Start, this->Spacing, this->Dim, this->OutPointData, this->MaskArray, weights);
928 }
929 }
(lldb)
Seems basically a race on setting/getting a flag that some work was done:
if (maskArray[pointId] == static_cast<char>(1))
{
// skip points which have already been probed with success.
// This is helpful for multiblock dataset probing.
continue;
}