From: Pawel Date: Thu, 4 Jul 2013 09:12:27 +0000 (+0400) Subject: 0024050: Voxel_FastConverter::Convert / ConvertUsingSAT - problems in multithreaded... X-Git-Tag: V6_7_0_beta~224 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=03679c4858300e2b68bdb734f54d85a4feeb145f 0024050: Voxel_FastConverter::Convert / ConvertUsingSAT - problems in multithreaded scenario Computing triangle spans using integer numbers. --- diff --git a/src/Voxel/Voxel_FastConverter.cxx b/src/Voxel/Voxel_FastConverter.cxx index 9ed441114f..1401044e82 100755 --- a/src/Voxel/Voxel_FastConverter.cxx +++ b/src/Voxel/Voxel_FastConverter.cxx @@ -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;