aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-21 00:19:14 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-21 00:19:14 +0000
commit5c161c3a8f48efea543766c756692854949d832c (patch)
tree49775a9a6ea0364f47b975ed791f8081d349e79a /include
parent1d1a115108d8ae01a7b4f843b2631e479bb52fca (diff)
Fix random crashes when using the MeetMe application. This patch converts list
handling to use the linked list macros and most importantly, implements reference counting on the ast_conference objects. The reference counting was first backported from 1.4. However, that code has some problems that caused the reference count to never hit zero. Those problems are fixed in this patch and will be resolved in 1.4 and trunk next, with a different patch. (issues #7647, #9073, #9106, BE-115). git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@55750 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include')
-rw-r--r--include/asterisk/lock.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h
index dc9cf9a28..67deba4dd 100644
--- a/include/asterisk/lock.h
+++ b/include/asterisk/lock.h
@@ -666,4 +666,31 @@ static inline int ast_cond_timedwait(ast_cond_t *cond, ast_mutex_t *t, const str
#define pthread_create __use_ast_pthread_create_instead__
#endif
+int ast_atomic_fetchadd_int_slow(volatile int *p, int v);
+
+#include "asterisk/inline_api.h"
+
+#if defined (__i386__)
+AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v),
+{
+ __asm __volatile (
+ " lock xaddl %0, %1 ; "
+ : "+r" (v), /* 0 (result) */
+ "=m" (*p) /* 1 */
+ : "m" (*p)); /* 2 */
+ return (v);
+})
+#else /* low performance version in utils.c */
+AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v),
+{
+ return ast_atomic_fetchadd_int_slow(p, v);
+})
+#endif
+
+AST_INLINE_API(int ast_atomic_dec_and_test(volatile int *p),
+{
+ int a = ast_atomic_fetchadd_int(p, -1);
+ return a == 1; /* true if the value is 0 now (so it was 1 previously) */
+})
+
#endif /* _ASTERISK_LOCK_H */