]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make lock information for ao2_trylock be more useful and gnarly
authorMark Michelson <mmichelson@digium.com>
Thu, 12 Feb 2009 16:28:06 +0000 (16:28 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 12 Feb 2009 16:28:06 +0000 (16:28 +0000)
Core show locks information involving an ao2_trylock did not
show the function that called ao2_trylock, but would instead
show ao2_trylock as the source of the lock. This is not useful
when trying to debug locking issues.

One bizarre note is that this logic is already in 1.4 but somehow
did not get merged to trunk or the 1.6.X branches.

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

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

index 040f6726aeb15257fe3c79fa7abed7c22d782fb3..1484d2bd09272eabca256eadba532bf718849bb1 100644 (file)
@@ -478,7 +478,12 @@ 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);
+#endif
 
 /*! \brief
  * Return the lock address of an object
index 21dc927337f814ff81667852760e48b620e52acc..8e33f94ae6dfc5a2ee89a38db8fb6b43454fcdc0 100644 (file)
@@ -188,14 +188,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)
+#endif
 {
        struct astobj2 *p = INTERNAL_OBJ(user_data);
        int ret;
        
        if (p == NULL)
                return -1;
-       ret =  ast_mutex_trylock(&p->priv_data.lock);
+#ifndef DEBUG_THREADS
+       ret = ast_mutex_trylock(&p->priv_data.lock);
+#else
+       ret = __ast_pthread_mutex_trylock(file, line, func, var, &p->priv_data.lock);
+#endif
+
 #ifdef AO2_DEBUG
        if (!ret)
                ast_atomic_fetchadd_int(&ao2.total_locked, 1);