diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-10-01 21:07:06 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-10-01 21:07:06 +0000 |
commit | 84fc2a4c0fbde326472741b289ebab952d631f3d (patch) | |
tree | be5e818c458a90a2951f9890e321f780ec9b5911 /main/utils.c | |
parent | 662cae0c397d15d9d4f5ec30099fb07e711a7f26 (diff) |
Fulfull a feature request from Qwell on the "core show locks" output. It will
now note the lock type for each lock that a thread holds.
(mutex, rdlock, or wrlock)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@84271 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/utils.c')
-rw-r--r-- | main/utils.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/main/utils.c b/main/utils.c index 56d3ffe85..e6b33fb1d 100644 --- a/main/utils.c +++ b/main/utils.c @@ -538,6 +538,7 @@ struct thr_lock_info { const char *lock_name; void *lock_addr; int times_locked; + enum ast_lock_type type; /*! This thread is waiting on this lock */ unsigned int pending:1; } locks[AST_MAX_LOCKS]; @@ -583,8 +584,8 @@ static void lock_info_destroy(void *data) */ AST_THREADSTORAGE_CUSTOM(thread_lock_info, thread_lock_info_init, lock_info_destroy); -void ast_store_lock_info(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) { struct thr_lock_info *lock_info; int i; @@ -616,6 +617,7 @@ void ast_store_lock_info(const char *filename, int line_num, lock_info->locks[i].lock_name = lock_name; lock_info->locks[i].lock_addr = lock_addr; lock_info->locks[i].times_locked = 1; + lock_info->locks[i].type = type; lock_info->locks[i].pending = 1; lock_info->num_locks++; @@ -672,6 +674,20 @@ void ast_remove_lock_info(void *lock_addr) pthread_mutex_unlock(&lock_info->lock); } +static const char *locktype2str(enum ast_lock_type type) +{ + switch (type) { + case AST_MUTEX: + return "MUTEX"; + case AST_RDLOCK: + return "RDLOCK"; + case AST_WRLOCK: + return "WRLOCK"; + } + + return "UNKNOWN"; +} + static int handle_show_locks(int fd, int argc, char *argv[]) { struct thr_lock_info *lock_info; @@ -691,9 +707,11 @@ static int handle_show_locks(int fd, int argc, char *argv[]) lock_info->thread_name); pthread_mutex_lock(&lock_info->lock); for (i = 0; i < lock_info->num_locks; i++) { - ast_cli(fd, "=== ---> %sLock #%d: %s %d %s %s %p (%d)\n", + ast_cli(fd, "=== ---> %sLock #%d (%s): %s %d %s %s %p (%d)\n", lock_info->locks[i].pending ? "Waiting for " : "", i, - lock_info->locks[i].file, lock_info->locks[i].line_num, + lock_info->locks[i].file, + locktype2str(lock_info->locks[i].type), + lock_info->locks[i].line_num, lock_info->locks[i].func, lock_info->locks[i].lock_name, lock_info->locks[i].lock_addr, lock_info->locks[i].times_locked); |