aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-29 17:20:16 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-29 17:20:16 +0000
commitbca55854e272254e9a80c364a93a11de94fd66cd (patch)
treef9dba4c3b8fb8146d3f0ee9d71f57b489ee6baa2 /main
parent5ccf4bbcb3e3cdc8fcf2bce3cb9c65c66b5cdeea (diff)
Add some debugging code that ensures that when we do deadlock avoidance, we
don't lose the information about how a lock was originally acquired. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@118953 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/utils.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/main/utils.c b/main/utils.c
index 5190f5f64..7b6e64812 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -662,6 +662,34 @@ void ast_mark_lock_failed(void *lock_addr)
pthread_mutex_unlock(&lock_info->lock);
}
+int ast_find_lock_info(void *lock_addr, const char **filename, int *lineno, const char **func, const char **mutex_name)
+{
+ struct thr_lock_info *lock_info;
+ int i = 0;
+
+ if (!(lock_info = ast_threadstorage_get(&thread_lock_info, sizeof(*lock_info))))
+ return -1;
+
+ pthread_mutex_lock(&lock_info->lock);
+
+ for (i = lock_info->num_locks - 1; i >= 0; i--) {
+ if (lock_info->locks[i].lock_addr == lock_addr)
+ break;
+ }
+
+ if (i == -1) {
+ /* Lock not found :( */
+ pthread_mutex_unlock(&lock_info->lock);
+ return -1;
+ }
+
+ *filename = lock_info->locks[i].file;
+ *lineno = lock_info->locks[i].line_num;
+ *func = lock_info->locks[i].func;
+ *mutex_name = lock_info->locks[i].lock_name;
+ return 0;
+}
+
void ast_remove_lock_info(void *lock_addr)
{
struct thr_lock_info *lock_info;