diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp index f61126b3d9..151c4ac9cb 100644 --- a/modules/core/src/umatrix.cpp +++ b/modules/core/src/umatrix.cpp @@ -84,14 +84,11 @@ UMatData::~UMatData() allocatorFlags_ = 0; if (originalUMatData) { - UMatData* u = originalUMatData; - CV_XADD(&(u->urefcount), -1); - CV_XADD(&(u->refcount), -1); bool showWarn = false; - if (u->refcount == 0) + UMatData* u = originalUMatData; + bool zero_Ref = CV_XADD(&(u->refcount), -1) == 1; + if (zero_Ref) { - if (u->urefcount > 0) - showWarn = true; // simulate Mat::deallocate if (u->mapcount != 0) { @@ -102,7 +99,10 @@ UMatData::~UMatData() // we don't do "map", so we can't do "unmap" } } - if (u->refcount == 0 && u->urefcount == 0) // oops, we need to free resources + bool zero_URef = CV_XADD(&(u->urefcount), -1) == 1; + if (zero_Ref && !zero_URef) + showWarn = true; + if (zero_Ref && zero_URef) // oops, we need to free resources { showWarn = true; // simulate UMat::deallocate