0024050: Voxel_FastConverter::Convert / ConvertUsingSAT - problems in multithreaded...
authorPawel <pawel-kowalski@wp.pl>
Thu, 4 Jul 2013 09:12:27 +0000 (13:12 +0400)
committerPawel <pawel-kowalski@wp.pl>
Thu, 4 Jul 2013 10:12:49 +0000 (14:12 +0400)
Computing triangle spans using integer numbers.

src/Voxel/Voxel_FastConverter.cxx

index 9ed4411..1401044 100755 (executable)
@@ -189,8 +189,21 @@ Standard_Boolean Voxel_FastConverter::Convert(Standard_Integer&      progress,
 
   // Compute the scope of triangles for current thread
   Standard_Integer start_thread_triangle = 1, end_thread_triangle = myNbTriangles, ithread_triangle = 0;
-  start_thread_triangle = (ithread - 1) * (myNbTriangles / myNbThreads) + 1;
-  end_thread_triangle   = (ithread - 0) * (myNbTriangles / myNbThreads);
+  if(myNbTriangles < myNbThreads)
+  {
+    if(ithread != 1)
+      return Standard_False;
+    //in case we're in thread one process all triangles
+  }
+  else
+  {
+    div_t division = div(myNbTriangles, myNbThreads);
+    start_thread_triangle = (ithread - 1) * division.quot + 1;
+    end_thread_triangle   = (ithread - 0) * division.quot;
+
+    if(ithread == myNbThreads)
+      end_thread_triangle += division.rem;
+  }
 
   // Convert
   TopLoc_Location L;
@@ -314,8 +327,21 @@ Standard_Boolean Voxel_FastConverter::ConvertUsingSAT(Standard_Integer&      pro
 
   // Compute the scope of triangles for current thread
   Standard_Integer start_thread_triangle = 1, end_thread_triangle = myNbTriangles, ithread_triangle = 0;
-  start_thread_triangle = (ithread - 1) * (myNbTriangles / myNbThreads) + 1;
-  end_thread_triangle   = (ithread - 0) * (myNbTriangles / myNbThreads);
+  if(myNbTriangles < myNbThreads)
+  {
+    if(ithread != 1)
+      return Standard_False;
+    //in case we're in thread one process all triangles
+  }
+  else
+  {
+    div_t division = div(myNbTriangles, myNbThreads);
+    start_thread_triangle = (ithread - 1) * division.quot + 1;
+    end_thread_triangle   = (ithread - 0) * division.quot;
+
+    if(ithread == myNbThreads)
+      end_thread_triangle += division.rem;
+  }
 
   // Convert
   TopLoc_Location L;