Merge pull request #5135 from alalek:issue_4468
This commit is contained in:
commit
09b9b0fb9e
@ -1044,6 +1044,76 @@ 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, DISABLED_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 < 100; 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);
|
||||
printf(".\n"); fflush(stdout);
|
||||
}
|
||||
}
|
||||
|
||||
// Case 2: concurent deallocation of UMatData between UMat and Mat deallocators. Hard to catch!
|
||||
OCL_TEST(UMat, DISABLED_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 < 100; 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
|
||||
}
|
||||
printf(".\n"); fflush(stdout);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
TEST(UMat, DISABLED_Test_same_behaviour_read_and_read)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user