diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-23 22:35:50 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-23 22:35:50 +0000 |
commit | c0ca2a427bbbe205b9fd8d7a2c8b119cb56c6c80 (patch) | |
tree | c8d0825b33b156cc9ea02bc81363305f700e8393 /utils | |
parent | 972905a6358c269996d5d7abaa89a4f2d5d350fa (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.c | 14 | ||||
-rw-r--r-- | utils/check_expr.c | 24 | ||||
-rw-r--r-- | utils/conf2ael.c | 14 | ||||
-rw-r--r-- | utils/hashtest.c | 20 | ||||
-rw-r--r-- | utils/hashtest2.c | 17 | ||||
-rw-r--r-- | utils/refcounter.c | 19 |
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 |