diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-02-28 22:39:26 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-02-28 22:39:26 +0000 |
commit | 020573b8ac5cacaef68586712538067febee0d67 (patch) | |
tree | 897a726d01e6359400224e1db3450880fcfe68ab /main/utils.c | |
parent | d4718af66edfa3f0a64dc8a92cf24c8215fcb635 (diff) |
Merged revisions 105116 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r105116 | russell | 2008-02-28 16:23:05 -0600 (Thu, 28 Feb 2008) | 8 lines
Fix a bug in the lock tracking code that was discovered by mmichelson. The issue
is that if the lock history array was full, then the functions to mark a lock as
acquired or not would adjust the stats for whatever lock is at the end of the array,
which may not be itself. So, do a sanity check to make sure that we're updating
lock info for the proper lock.
(This explains the bizarre stats on lock #63 in BE-396, thanks Mark!)
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@105144 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/utils.c')
-rw-r--r-- | main/utils.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/main/utils.c b/main/utils.c index fcdd527dd..f8421b0c5 100644 --- a/main/utils.c +++ b/main/utils.c @@ -633,7 +633,7 @@ void ast_store_lock_info(enum ast_lock_type type, const char *filename, pthread_mutex_unlock(&lock_info->lock); } -void ast_mark_lock_acquired(void) +void ast_mark_lock_acquired(void *lock_addr) { struct thr_lock_info *lock_info; @@ -641,11 +641,13 @@ void ast_mark_lock_acquired(void) return; pthread_mutex_lock(&lock_info->lock); - lock_info->locks[lock_info->num_locks - 1].pending = 0; + if (lock_info->locks[lock_info->num_locks - 1].lock_addr == lock_addr) { + lock_info->locks[lock_info->num_locks - 1].pending = 0; + } pthread_mutex_unlock(&lock_info->lock); } -void ast_mark_lock_failed(void) +void ast_mark_lock_failed(void *lock_addr) { struct thr_lock_info *lock_info; @@ -653,8 +655,10 @@ void ast_mark_lock_failed(void) return; pthread_mutex_lock(&lock_info->lock); - lock_info->locks[lock_info->num_locks - 1].pending = -1; - lock_info->locks[lock_info->num_locks - 1].times_locked--; + if (lock_info->locks[lock_info->num_locks - 1].lock_addr == lock_addr) { + lock_info->locks[lock_info->num_locks - 1].pending = -1; + lock_info->locks[lock_info->num_locks - 1].times_locked--; + } pthread_mutex_unlock(&lock_info->lock); } |