From 8293ed7f9b9cbae0c585f191bc80f1910e92b8f8 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 5 Aug 2015 17:27:18 +0300 Subject: [PATCH] add tests from issue 4468 (#5062) --- modules/core/test/test_umat.cpp | 68 +++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/modules/core/test/test_umat.cpp b/modules/core/test/test_umat.cpp index 3640d930f..4b2b7c1a6 100644 --- a/modules/core/test/test_umat.cpp +++ b/modules/core/test/test_umat.cpp @@ -1026,6 +1026,74 @@ TEST(UMat, map_unmap_counting) } +///////////// oclCleanupCallback threadsafe check (#5062) ///////////////////// + +// Case 1: reuse of old src Mat in OCL pipe. Hard to catch! +OCL_TEST(UMat, OCL_ThreadSafe_CleanupCallback_1_VeryLongTest) +{ + if (!cv::ocl::useOpenCL()) + { + std::cout << "OpenCL is not enabled. Skip test" << std::endl; + return; + } + for (int j = 0; j < test_loop_times; j++) + { + const Size srcSize(320, 240); + const int type = CV_8UC1; + const int dtype = CV_16UC1; + + Mat src(srcSize, type); + Mat dst_ref(srcSize, dtype); + + // Generate reference data as additional check + OCL_OFF(src.convertTo(dst_ref, dtype)); + cv::ocl::setUseOpenCL(true); // restore OpenCL state + + UMat dst(srcSize, dtype); + + // Use multiple iterations to increase chance of data race catching + for(int k = 0; k < 10000; k++) + { + UMat tmpUMat = src.getUMat(ACCESS_RW); + tmpUMat.convertTo(dst, dtype); + ::cv::ocl::finish(); // force kernel to complete to start cleanup sooner + } + + EXPECT_MAT_NEAR(dst_ref, dst, 1); + } +} + +// Case 2: concurent deallocation of UMatData between UMat and Mat deallocators. Hard to catch! +OCL_TEST(UMat, OCL_ThreadSafe_CleanupCallback_2_VeryLongTest) +{ + if (!cv::ocl::useOpenCL()) + { + std::cout << "OpenCL is not enabled. Skip test" << std::endl; + return; + } + for (int j = 0; j < test_loop_times; j++) + { + const Size srcSize(320, 240); + const int type = CV_8UC1; + const int dtype = CV_16UC1; + + // This test is only relevant for OCL + UMat dst(srcSize, dtype); + + // Use multiple iterations to increase chance of data race catching + for(int k = 0; k < 10000; k++) + { + Mat src(srcSize, type); // Declare src inside loop now to catch its destruction on stack + { + UMat tmpUMat = src.getUMat(ACCESS_RW); + tmpUMat.convertTo(dst, dtype); + } + ::cv::ocl::finish(); // force kernel to complete to start cleanup sooner + } + } +} + + TEST(UMat, DISABLED_Test_same_behaviour_read_and_read) {