From eccfefae2c27aa45b22f5852d5d19aa7db14de81 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 5 Dec 2007 00:35:31 +0000 Subject: [PATCH] Fix some crashes in chan_iax2 that were reported as happening on Mac systems. It turns out that the problem was the Mac version of the ast_atomic_fetchadd_int() function. The Mac atomic add function returns the _new_ value, while this function is supposed to return the old value. So, the crashes happened on unreferencing objects. If the reference count was decreased to 1, ao2_ref() thought that it had been decreased to zero, and called the destructor. However, there was still an outstanding reference around. (closes issue #11176) (closes issue #11289) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@91070 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- include/asterisk/lock.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h index 8d4e5c8f95..d9e5ec3726 100644 --- a/include/asterisk/lock.h +++ b/include/asterisk/lock.h @@ -1104,12 +1104,12 @@ AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), #elif defined(HAVE_OSX_ATOMICS) && (SIZEOF_INT == 4) AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), { - return OSAtomicAdd32(v, (int32_t *) p); + return OSAtomicAdd32(v, (int32_t *) p) - v; }) #elif defined(HAVE_OSX_ATOMICS) && (SIZEOF_INT == 8) AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), { - return OSAtomicAdd64(v, (int64_t *) p); + return OSAtomicAdd64(v, (int64_t *) p) - v; #elif defined (__i386__) #ifdef sun AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v),