aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-23 22:35:50 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-23 22:35:50 +0000
commitc0ca2a427bbbe205b9fd8d7a2c8b119cb56c6c80 (patch)
treec8d0825b33b156cc9ea02bc81363305f700e8393 /utils
parent972905a6358c269996d5d7abaa89a4f2d5d350fa (diff)
A new feature thanks to the fine folks at Switchvox!
If a deadlock is detected, then the typical lock information will be printed along with a backtrace of the stack for the offending threads. Use of this requires compiling with DETECT_DEADLOCKS and having glibc installed. Furthermore, issuing the "core show locks" CLI command will print the normal lock information as well as a backtraces for each lock. This requires that DEBUG_THREADS is enabled and that glibc is installed. All the backtrace features may be disabled by running the configure script with --without-execinfo as an argument git-svn-id: http://svn.digium.com/svn/asterisk/trunk@118173 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'utils')
-rw-r--r--utils/ael_main.c14
-rw-r--r--utils/check_expr.c24
-rw-r--r--utils/conf2ael.c14
-rw-r--r--utils/hashtest.c20
-rw-r--r--utils/hashtest2.c17
-rw-r--r--utils/refcounter.c19
6 files changed, 100 insertions, 8 deletions
diff --git a/utils/ael_main.c b/utils/ael_main.c
index f8477edd1..166fefb65 100644
--- a/utils/ael_main.c
+++ b/utils/ael_main.c
@@ -578,7 +578,16 @@ unsigned int ast_hashtab_hash_contexts(const void *obj)
void ast_mark_lock_acquired(void *lock_addr)
{
}
+#ifdef HAVE_BKTR
+void ast_remove_lock_info(void *lock_addr, struct ast_bt *bt)
+{
+}
+void ast_store_lock_info(enum ast_lock_type type, const char *filename,
+ int line_num, const char *func, const char *lock_name, void *lock_addr, struct ast_bt *bt)
+{
+}
+#else
void ast_remove_lock_info(void *lock_addr)
{
}
@@ -587,5 +596,6 @@ void ast_store_lock_info(enum ast_lock_type type, const char *filename,
int line_num, const char *func, const char *lock_name, void *lock_addr)
{
}
-#endif
-#endif
+#endif /* HAVE_BKTR */
+#endif /* !defined(LOW_MEMORY) */
+#endif /* DEBUG_THREADS */
diff --git a/utils/check_expr.c b/utils/check_expr.c
index 7b013f163..5293acc26 100644
--- a/utils/check_expr.c
+++ b/utils/check_expr.c
@@ -86,16 +86,25 @@ enum ast_lock_type {
};
#endif
#if !defined(LOW_MEMORY)
+#ifdef HAVE_BKTR
void ast_store_lock_info(enum ast_lock_type type, const char *filename,
- int line_num, const char *func, const char *lock_name, void *lock_addr);
+ int line_num, const char *func, const char *lock_name, void *lock_addr, struct ast_bt *bt);
void ast_store_lock_info(enum ast_lock_type type, const char *filename,
- int line_num, const char *func, const char *lock_name, void *lock_addr)
+ int line_num, const char *func, const char *lock_name, void *lock_addr, struct ast_bt *bt)
{
/* not a lot to do in a standalone w/o threading! */
}
-void ast_mark_lock_acquired(void *);
-void ast_mark_lock_acquired(void *foo)
+void ast_remove_lock_info(void *lock_addr, struct ast_bt *bt);
+void ast_remove_lock_info(void *lock_addr, struct ast_bt *bt)
+{
+ /* not a lot to do in a standalone w/o threading! */
+}
+#else
+void ast_store_lock_info(enum ast_lock_type type, const char *filename,
+ int line_num, const char *func, const char *lock_name, void *lock_addr);
+void ast_store_lock_info(enum ast_lock_type type, const char *filename,
+ int line_num, const char *func, const char *lock_name, void *lock_addr)
{
/* not a lot to do in a standalone w/o threading! */
}
@@ -105,6 +114,13 @@ void ast_remove_lock_info(void *lock_addr)
{
/* not a lot to do in a standalone w/o threading! */
}
+#endif /* HAVE_BKTR */
+
+void ast_mark_lock_acquired(void *);
+void ast_mark_lock_acquired(void *foo)
+{
+ /* not a lot to do in a standalone w/o threading! */
+}
#endif
static int global_lineno = 1;
diff --git a/utils/conf2ael.c b/utils/conf2ael.c
index 4572cbd5d..a55a79512 100644
--- a/utils/conf2ael.c
+++ b/utils/conf2ael.c
@@ -705,7 +705,16 @@ unsigned int ast_hashtab_hash_contexts(const void *obj)
void ast_mark_lock_acquired(void *lock_addr)
{
}
+#ifdef HAVE_BKTR
+void ast_remove_lock_info(void *lock_addr, struct ast_bt *bt)
+{
+}
+void ast_store_lock_info(enum ast_lock_type type, const char *filename,
+ int line_num, const char *func, const char *lock_name, void *lock_addr, struct ast_bt *bt)
+{
+}
+#else
void ast_remove_lock_info(void *lock_addr)
{
}
@@ -714,5 +723,6 @@ void ast_store_lock_info(enum ast_lock_type type, const char *filename,
int line_num, const char *func, const char *lock_name, void *lock_addr)
{
}
-#endif
-#endif
+#endif /* HAVE_BKTR */
+#endif /* !defined(LOW_MEMORY) */
+#endif /* DEBUG_THREADS */
diff --git a/utils/hashtest.c b/utils/hashtest.c
index 95f463da7..7ff7a55b2 100644
--- a/utils/hashtest.c
+++ b/utils/hashtest.c
@@ -366,3 +366,23 @@ void ast_register_thread(char *name)
void ast_unregister_thread(void *id)
{
}
+
+#ifdef HAVE_BKTR
+struct ast_bt *ast_bt_create(void);
+struct ast_bt *ast_bt_create(void)
+{
+ return NULL;
+}
+
+int ast_bt_get_addresses(struct ast_bt *bt);
+int ast_bt_get_addresses(struct ast_bt *bt)
+{
+ return 0;
+}
+
+void *ast_bt_destroy(struct ast_bt *bt);
+void *ast_bt_destroy(struct ast_bt *bt)
+{
+ return NULL;
+}
+#endif
diff --git a/utils/hashtest2.c b/utils/hashtest2.c
index 2865822ab..27ed30722 100644
--- a/utils/hashtest2.c
+++ b/utils/hashtest2.c
@@ -378,3 +378,20 @@ void ast_register_thread(char *name)
void ast_unregister_thread(void *id)
{
}
+
+#ifdef HAVE_BKTR
+struct ast_bt* ast_bt_create(void)
+{
+ return NULL;
+}
+
+int ast_bt_get_addresses(struct ast_bt *bt)
+{
+ return -1;
+}
+
+void *ast_bt_destroy(struct ast_bt *bt)
+{
+ return NULL;
+}
+#endif
diff --git a/utils/refcounter.c b/utils/refcounter.c
index 5e750619e..4712c26b6 100644
--- a/utils/refcounter.c
+++ b/utils/refcounter.c
@@ -269,3 +269,22 @@ void ast_register_thread(char *name)
void ast_unregister_thread(void *id)
{
}
+#ifdef HAVE_BKTR
+struct ast_bt *ast_bt_create(void);
+struct ast_bt *ast_bt_create(void)
+{
+ return NULL;
+}
+
+int ast_bt_get_addresses(struct ast_bt *bt);
+int ast_bt_get_addresses(struct ast_bt *bt)
+{
+ return 0;
+}
+
+void *ast_bt_destroy(struct ast_bt *bt);
+void *ast_bt_destroy(struct ast_bt *bt)
+{
+ return NULL;
+}
+#endif