core(ocl): do not split refcount operations / compare
authorAlexander Alekhin <alexander.alekhin@intel.com>
Mon, 30 Jul 2018 11:09:50 +0000 (14:09 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Mon, 30 Jul 2018 12:42:09 +0000 (15:42 +0300)
- check result from CV_XADD() directly
- decrease urefcount after unmap() call only

modules/core/src/umatrix.cpp

index f61126b..151c4ac 100644 (file)
@@ -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