[vtk6] 01/10: Add patch to fix race condition
Gert Wollny
gert-guest at moszumanska.debian.org
Tue Feb 2 16:38:00 UTC 2016
This is an automated email from the git hooks/post-receive script.
gert-guest pushed a commit to branch master
in repository vtk6.
commit 88349595a1410bbb8670fbd31550c38297f15b68
Author: Gert Wollny <gw.fossdev at gmail.com>
Date: Sun Jan 31 17:40:33 2016 +0100
Add patch to fix race condition
---
debian/changelog | 7 +
.../96_concurrent_vtkLookupTableMapData_fix.patch | 198 +++++++++++++++++++++
debian/patches/series | 1 +
3 files changed, 206 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index f8003d3..e2927d0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+vtk6 (6.2.0+dfsg1-6.1) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload
+ * d/patched/96 Fix race condition in vtkLookupTableMapdata
+
+ -- Gert Wollny <gw.fossdev at gmail.com> Sun, 31 Jan 2016 17:37:41 +0100
+
vtk6 (6.2.0+dfsg1-6) unstable; urgency=medium
* [18cd92a] Add missing libaec-dev to build-depends.
diff --git a/debian/patches/96_concurrent_vtkLookupTableMapData_fix.patch b/debian/patches/96_concurrent_vtkLookupTableMapData_fix.patch
new file mode 100644
index 0000000..242b2f3
--- /dev/null
+++ b/debian/patches/96_concurrent_vtkLookupTableMapData_fix.patch
@@ -0,0 +1,198 @@
+Description: Fix crash in function called from multiple threads
+ vtkLookupTableMapData() was not thread safe and could lead to
+ crashes when accessed from multiple threads. Added a mutex around
+ the logic to determine if the color table size needed to be
+ increased.
+ .
+ Added a multi-threaded test that crashes on occasion prior
+ to this patch, but does not crash with this patch applied.
+Author: Cory Quammen <cory.quammen at kitware.com>
+Last-Update: 2016-01-31
+Bug: http://www.vtk.org/Bug/view.php?id=15365
+
+diff --git a/Common/Core/Testing/Cxx/CMakeLists.txt b/Common/Core/Testing/Cxx/CMakeLists.txt
+--- a/Common/Core/Testing/Cxx/CMakeLists.txt
++++ b/Common/Core/Testing/Cxx/CMakeLists.txt
+@@ -32,6 +32,7 @@ vtk_add_test_cxx(${vtk-module}CxxTests tests
+ TestGarbageCollector.cxx
+ # TestInstantiator.cxx # Have not enabled instantiators.
+ TestLookupTable.cxx
++ TestLookupTableThreaded.cxx
+ TestMath.cxx
+ TestMinimalStandardRandomSequence.cxx
+ TestNew.cxx
+diff --git a/Common/Core/Testing/Cxx/TestLookupTableThreaded.cxx b/Common/Core/Testing/Cxx/TestLookupTableThreaded.cxx
+new file mode 100644
+index 0000000..4330609
+--- /dev/null
++++ b/Common/Core/Testing/Cxx/TestLookupTableThreaded.cxx
+@@ -0,0 +1,57 @@
++/*=========================================================================
++
++ Program: Visualization Toolkit
++ Module: TestLookupTableThreaded.cxx
++
++ Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
++ All rights reserved.
++ See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
++
++ This software is distributed WITHOUT ANY WARRANTY; without even
++ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
++ PURPOSE. See the above copyright notice for more information.
++
++=========================================================================*/
++
++#include "vtkLookupTable.h"
++#include "vtkMultiThreader.h"
++#include "vtkNew.h"
++
++namespace {
++
++vtkLookupTable * lut;
++
++VTK_THREAD_RETURN_TYPE ThreadedMethod(void *)
++{
++ int numberOfValues = 25;
++ double* input = new double[numberOfValues];
++ unsigned char* output = new unsigned char[4*numberOfValues];
++ int inputType = VTK_DOUBLE;
++ int inputIncrement = 1;
++ int outputFormat = VTK_RGBA;
++
++ lut->MapScalarsThroughTable2(input, output, inputType, numberOfValues,
++ inputIncrement, outputFormat);
++
++ delete[] input;
++ delete[] output;
++
++ return VTK_THREAD_RETURN_VALUE;
++}
++
++} // end anonymous namespace
++
++int TestLookupTableThreaded(int, char* [])
++{
++ lut = vtkLookupTable::New();
++ lut->SetNumberOfTableValues( 1024 );
++
++ vtkNew<vtkMultiThreader> threader;
++ threader->SetSingleMethod( ThreadedMethod, NULL );
++ threader->SetNumberOfThreads( 4 );
++ threader->SingleMethodExecute();
++
++ lut->Delete();
++
++ return EXIT_SUCCESS;
++}
+diff --git a/Common/Core/vtkLookupTable.cxx b/Common/Core/vtkLookupTable.cxx
+index 53d9663..2d90054 100644
+--- a/Common/Core/vtkLookupTable.cxx
++++ b/Common/Core/vtkLookupTable.cxx
+@@ -18,6 +18,7 @@
+ #include "vtkBitArray.h"
+ #include "vtkMath.h"
+ #include "vtkMathConfigure.h"
++#include "vtkMutexLock.h"
+ #include "vtkObjectFactory.h"
+ #include "vtkStringArray.h"
+ #include "vtkVariantArray.h"
+@@ -81,6 +82,8 @@ vtkLookupTable::vtkLookupTable(int sze, int ext)
+ this->Scale = VTK_SCALE_LINEAR;
+
+ this->OpaqueFlag=1;
++
++ this->ResizeMutex = vtkSimpleMutexLock::New();
+ }
+
+ //----------------------------------------------------------------------------
+@@ -88,6 +91,7 @@ vtkLookupTable::~vtkLookupTable()
+ {
+ this->Table->UnRegister( this );
+ this->Table = NULL;
++ this->ResizeMutex->Delete();
+ }
+
+ //----------------------------------------------------------------------------
+@@ -641,8 +645,8 @@ namespace {
+
+ //----------------------------------------------------------------------------
+ template<class T>
+-void vtkLookupTableMapData(vtkLookupTable *self, T *input,
+- unsigned char *output, int length,
++void vtkLookupTableMapData(vtkLookupTable *self, vtkSimpleMutexLock *mutex,
++ T *input, unsigned char *output, int length,
+ int inIncr, int outFormat, TableParameters & p)
+ {
+ int i = length;
+@@ -654,14 +658,24 @@ void vtkLookupTableMapData(vtkLookupTable *self, T *input,
+ // end. When this function is called repeatedly with the same size
+ // lookup table, memory reallocation will be done only one the first
+ // call if at all.
++
+ vtkUnsignedCharArray* lookupTable = self->GetTable();
+ vtkIdType numberOfColors = lookupTable->GetNumberOfTuples();
+ vtkIdType neededSize = (numberOfColors + vtkLookupTable::NUMBER_OF_SPECIAL_COLORS) *
+ lookupTable->GetNumberOfComponents();
++
++ // Since this involves a potential array resize and this function
++ // might be accessed concurently from more than one thread, we need a
++ // mutex here. This shouldn't affect performance much if this function
++ // is used to map many input values, but if it is called repeatedly
++ // with short input arrays, performance may be much worse.
++ mutex->Lock();
+ if (lookupTable->GetSize() < neededSize)
+ {
+ lookupTable->Resize(numberOfColors + vtkLookupTable::NUMBER_OF_SPECIAL_COLORS);
+ }
++ mutex->Unlock();
++
+ unsigned char* table = lookupTable->GetPointer(0);
+
+ // Writing directly to the memory location instead of adding them
+@@ -1159,7 +1173,7 @@ void vtkLookupTable::MapScalarsThroughTable2(void *input,
+ {
+ newInput->SetValue(i, bitArray->GetValue(id));
+ }
+- vtkLookupTableMapData(this,
++ vtkLookupTableMapData(this, this->ResizeMutex,
+ static_cast<unsigned char*>(newInput->GetPointer(0)),
+ output, numberOfValues,
+ inputIncrement, outputFormat, p);
+@@ -1169,7 +1183,7 @@ void vtkLookupTable::MapScalarsThroughTable2(void *input,
+ break;
+
+ vtkTemplateMacro(
+- vtkLookupTableMapData(this,static_cast<VTK_TT*>(input),output,
++ vtkLookupTableMapData(this, this->ResizeMutex, static_cast<VTK_TT*>(input),output,
+ numberOfValues, inputIncrement, outputFormat, p)
+ );
+ default:
+diff --git a/Common/Core/vtkLookupTable.h b/Common/Core/vtkLookupTable.h
+index f233c85..d0401df 100644
+--- a/Common/Core/vtkLookupTable.h
++++ b/Common/Core/vtkLookupTable.h
+@@ -56,6 +56,8 @@
+
+ #include "vtkUnsignedCharArray.h" // Needed for inline method
+
++class vtkSimpleMutexLock;
++
+ #define VTK_RAMP_LINEAR 0
+ #define VTK_RAMP_SCURVE 1
+ #define VTK_RAMP_SQRT 2
+@@ -359,6 +361,8 @@ protected:
+ int OpaqueFlag;
+ vtkTimeStamp OpaqueFlagBuildTime;
+
++ vtkSimpleMutexLock* ResizeMutex;
++
+ private:
+ vtkLookupTable(const vtkLookupTable&); // Not implemented.
+ void operator=(const vtkLookupTable&); // Not implemented.
+@@ -373,6 +377,3 @@ inline unsigned char *vtkLookupTable::WritePointer(const vtkIdType id,
+ }
+
+ #endif
+-
+-
+-
diff --git a/debian/patches/series b/debian/patches/series
index 23a2c92..9582b3a 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -8,3 +8,4 @@
80_fix_arm_compilation.patch
90_gdal-2.0.patch
95_ffmpeg_2.9.patch
+96_concurrent_vtkLookupTableMapData_fix.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/vtk6.git
More information about the debian-science-commits
mailing list