0030573: OSD_Parallel_TBB: limit number of execution threads using settings of OSD_Th...
[occt.git] / src / OSD / OSD_Parallel_TBB.cxx
index 508119f..425fdf2 100644 (file)
 #ifdef HAVE_TBB
 
 #include <OSD_Parallel.hxx>
+#include <OSD_ThreadPool.hxx>
 #include <Standard_ProgramError.hxx>
 
 #include <tbb/parallel_for.h>
 #include <tbb/parallel_for_each.h>
 #include <tbb/blocked_range.h>
+#include <tbb/task_scheduler_init.h>
 
 //=======================================================================
 //function : forEach
@@ -34,15 +36,19 @@ void OSD_Parallel::forEach (UniversalIterator& theBegin,
                             const FunctorInterface& theFunctor,
                             Standard_Integer theNbItems)
 {
-  (void )theNbItems;
   try
   {
-    tbb::parallel_for_each(theBegin, theEnd, theFunctor);
+    const Handle(OSD_ThreadPool)& aThreadPool = OSD_ThreadPool::DefaultPool();
+    const Standard_Integer aNbThreads = theNbItems > 0 ?
+      Min (theNbItems, aThreadPool->NbDefaultThreadsToLaunch()) : -1;
+
+    tbb::task_scheduler_init aScheduler (aNbThreads);
+    tbb::parallel_for_each (theBegin, theEnd, theFunctor);
   }
   catch (tbb::captured_exception& anException)
   {
-    throw Standard_ProgramError(anException.what());
+    throw Standard_ProgramError (anException.what());
   }
 }
 
-#endif /* HAVE_TBB */
\ No newline at end of file
+#endif /* HAVE_TBB */