]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
astobj2: tweak ao2_replace to do nothing when it would be a NoOp
authorCorey Farrell <git@cfware.com>
Fri, 11 Jul 2014 21:09:43 +0000 (21:09 +0000)
committerCorey Farrell <git@cfware.com>
Fri, 11 Jul 2014 21:09:43 +0000 (21:09 +0000)
This change causes ao2_replace to do nothing when src == dst. This
avoids REF_DEBUG logging when we're not actually doing anything.

Review: https://reviewboard.asterisk.org/r/3743/

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@418396 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/astobj2.h

index d1c75ff5f07782529f1bae2f6ccd846802da73fb..12b1b639b7ff3247445bdbd6f1a2cfa2d847c8b4 100644 (file)
@@ -561,13 +561,15 @@ int __ao2_ref(void *o, int delta);
        {\
                typeof(dst) *__dst_ ## __LINE__ = &dst; \
                typeof(src) __src_ ## __LINE__ = src; \
-               if (__src_ ## __LINE__) {\
-                       ao2_ref(__src_ ## __LINE__, +1); \
+               if (__src_ ## __LINE__ != *__dst_ ## __LINE__) { \
+                       if (__src_ ## __LINE__) {\
+                               ao2_ref(__src_ ## __LINE__, +1); \
+                       } \
+                       if (*__dst_ ## __LINE__) {\
+                               ao2_ref(*__dst_ ## __LINE__, -1); \
+                       } \
+                       *__dst_ ## __LINE__ = __src_ ## __LINE__; \
                } \
-               if (*__dst_ ## __LINE__) {\
-                       ao2_ref(*__dst_ ## __LINE__, -1); \
-               } \
-               *__dst_ ## __LINE__ = __src_ ## __LINE__; \
        }
 
 /*! @} */