message: core: fix flag processing for nested regions in cv::parallel_for_()
diff: @@ -363,6 +363,10 @@ static SchedPtr pplScheduler;
  /* ================================ 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
  @@ -377,10 +381,35 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
  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);
  @@ -388,7 +417,6 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
  if( stripeRange.end - stripeRange.start == 1 )
  {
  body(range);
  - flagNestedParallelFor = 0;
  return;
  }
  @@ -444,16 +472,14 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
  #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)
  {
  