/* ================================ parallel_for_ ================================ */
+#ifdef CV_PARALLEL_FRAMEWORK
+static void parallel_for_impl(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes); // forward declaration
+#endif
+
void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
{
#ifdef OPENCV_TRACE
return;
#ifdef CV_PARALLEL_FRAMEWORK
+ static volatile int flagNestedParallelFor = 0;
+ bool isNotNestedRegion = flagNestedParallelFor == 0;
+ if (isNotNestedRegion)
+ isNotNestedRegion = CV_XADD(&flagNestedParallelFor, 1) == 0;
+ if (isNotNestedRegion)
+ {
+ try
+ {
+ parallel_for_impl(range, body, nstripes);
+ flagNestedParallelFor = 0;
+ }
+ catch (...)
+ {
+ flagNestedParallelFor = 0;
+ throw;
+ }
+ }
+ else // nested parallel_for_() calls are not parallelized
+#endif // CV_PARALLEL_FRAMEWORK
+ {
+ (void)nstripes;
+ body(range);
+ }
+}
- static int flagNestedParallelFor = 0;
- bool isNotNesterParallelFor = CV_XADD(&flagNestedParallelFor, 1) == 0;
- if(numThreads != 0 && isNotNesterParallelFor)
+#ifdef CV_PARALLEL_FRAMEWORK
+static void parallel_for_impl(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
+{
+ if ((numThreads < 0 || numThreads > 1) && range.end - range.start > 1)
{
ParallelLoopBodyWrapperContext ctx(body, range, nstripes);
ProxyLoopBody pbody(ctx);
if( stripeRange.end - stripeRange.start == 1 )
{
body(range);
- flagNestedParallelFor = 0;
return;
}
#error You have hacked and compiling with unsupported parallel framework
#endif
- flagNestedParallelFor = 0;
}
else
-
-#endif // CV_PARALLEL_FRAMEWORK
{
- (void)nstripes;
body(range);
}
}
+#endif // CV_PARALLEL_FRAMEWORK
+
int cv::getNumThreads(void)
{