]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix DEBUG_THREADS issue with out-of-tree modules.
authorJason Parker <jparker@digium.com>
Thu, 25 Mar 2010 19:59:04 +0000 (19:59 +0000)
committerJason Parker <jparker@digium.com>
Thu, 25 Mar 2010 19:59:04 +0000 (19:59 +0000)
Take 2, without ABI breakage this time.

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

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

include/asterisk/astobj2.h
main/astobj2.c

index 22270c19a7441e242f1d70d7687d204526a4c96b..822f4ba4d35170761d5abbd876b4a00f44ae9eb3 100644 (file)
@@ -192,11 +192,10 @@ int ao2_ref(void *o, int delta);
  * \param a A pointer to the object we want lock.
  * \return 0 on success, other values on error.
  */
-#ifndef DEBUG_THREADS
 int ao2_lock(void *a);
-#else
-#define ao2_lock(a) _ao2_lock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
 int _ao2_lock(void *a, const char *file, const char *func, int line, const char *var);
+#ifdef DEBUG_THREADS
+#define ao2_lock(a) _ao2_lock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
 #endif
 
 /*! \brief
@@ -205,11 +204,10 @@ int _ao2_lock(void *a, const char *file, const char *func, int line, const char
  * \param a A pointer to the object we want unlock.
  * \return 0 on success, other values on error.
  */
-#ifndef DEBUG_THREADS
 int ao2_unlock(void *a);
-#else
-#define ao2_unlock(a) _ao2_unlock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
 int _ao2_unlock(void *a, const char *file, const char *func, int line, const char *var);
+#ifdef DEBUG_THREADS
+#define ao2_unlock(a) _ao2_unlock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
 #endif
 
 /*! \brief
@@ -218,11 +216,10 @@ int _ao2_unlock(void *a, const char *file, const char *func, int line, const cha
  * \param a A pointer to the object we want to lock.
  * \return 0 on success, other values on error.
  */
-#ifndef DEBUG_THREADS
 int ao2_trylock(void *a);
-#else
-#define ao2_trylock(a) _ao2_trylock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
 int _ao2_trylock(void *a, const char *file, const char *func, int line, const char *var);
+#ifdef DEBUG_THREADS
+#define ao2_trylock(a) _ao2_trylock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
 #endif
 
 /*! 
index 11846d6695b9b320118ad41e19be735569e5b979..ae2b2b65d9645cc7e94e0a550141a8e25900f6e7 100644 (file)
@@ -126,11 +126,28 @@ static inline struct astobj2 *INTERNAL_OBJ(void *user_data)
  */
 #define EXTERNAL_OBJ(_p)       ((_p) == NULL ? NULL : (_p)->user_data)
 
-#ifndef DEBUG_THREADS
+#ifdef DEBUG_THREADS
+/* Need to override the macros defined in astobj2.h */
+#undef ao2_lock
+#undef ao2_trylock
+#undef ao2_unlock
+#endif
+
 int ao2_lock(void *user_data)
-#else
-int _ao2_lock(void *user_data, const char *file, const char *func, int line, const char *var)
+{
+       struct astobj2 *p = INTERNAL_OBJ(user_data);
+
+       if (p == NULL)
+               return -1;
+
+#ifdef AO2_DEBUG
+       ast_atomic_fetchadd_int(&ao2.total_locked, 1);
 #endif
+
+       return ast_mutex_lock(&p->priv_data.lock);
+}
+
+int _ao2_lock(void *user_data, const char *file, const char *func, int line, const char *var)
 {
        struct astobj2 *p = INTERNAL_OBJ(user_data);
 
@@ -148,11 +165,21 @@ int _ao2_lock(void *user_data, const char *file, const char *func, int line, con
 #endif
 }
 
-#ifndef DEBUG_THREADS
 int ao2_unlock(void *user_data)
-#else
-int _ao2_unlock(void *user_data, const char *file, const char *func, int line, const char *var)
+{
+       struct astobj2 *p = INTERNAL_OBJ(user_data);
+
+       if (p == NULL)
+               return -1;
+
+#ifdef AO2_DEBUG
+       ast_atomic_fetchadd_int(&ao2.total_locked, -1);
 #endif
+
+       return ast_mutex_unlock(&p->priv_data.lock);
+}
+
+int _ao2_unlock(void *user_data, const char *file, const char *func, int line, const char *var)
 {
        struct astobj2 *p = INTERNAL_OBJ(user_data);
 
@@ -170,11 +197,23 @@ int _ao2_unlock(void *user_data, const char *file, const char *func, int line, c
 #endif
 }
 
-#ifndef DEBUG_THREADS
 int ao2_trylock(void *user_data)
-#else
-int _ao2_trylock(void *user_data, const char *file, const char *func, int line, const char *var)
+{
+       struct astobj2 *p = INTERNAL_OBJ(user_data);
+       int ret;
+       
+       if (p == NULL)
+               return -1;
+       ret = ast_mutex_trylock(&p->priv_data.lock);
+
+#ifdef AO2_DEBUG
+       if (!ret)
+               ast_atomic_fetchadd_int(&ao2.total_locked, 1);
 #endif
+       return ret;
+}
+
+int _ao2_trylock(void *user_data, const char *file, const char *func, int line, const char *var)
 {
        struct astobj2 *p = INTERNAL_OBJ(user_data);
        int ret;