aboutsummaryrefslogtreecommitdiffstats
path: root/main/utils.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-02-25 23:19:05 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-02-25 23:19:05 +0000
commit23ffeac6abcb7af9e63f75873950bec8c7c6027d (patch)
tree023391153c5539a2314f7c1840f8c7f349229690 /main/utils.c
parentd4baa3682593a2c685652c3b3cdd0874a3db6470 (diff)
Improve the lock tracking code a bit so that a bunch of old locks that threads
failed to lock don't sit around in the history. When a lock is first locked, this checks to see if the last lock in the list was one that was failed to be locked. If it is, then that was a lock that we're no longer sitting in a trylock loop trying to lock, so just remove it. (inspired by issue #11712) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@104102 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/utils.c')
-rw-r--r--main/utils.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/main/utils.c b/main/utils.c
index 07669692f..f309d87a1 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -610,7 +610,16 @@ void ast_store_lock_info(enum ast_lock_type type, const char *filename,
pthread_mutex_unlock(&lock_info->lock);
return;
}
-
+
+ if (i && lock_info->locks[i].pending == -1) {
+ /* The last lock on the list was one that this thread tried to lock but
+ * failed at doing so. It has now moved on to something else, so remove
+ * the old lock from the list. */
+ i--;
+ lock_info->num_locks--;
+ memset(&lock_info->locks[i], 0, sizeof(lock_info->locks[0]));
+ }
+
lock_info->locks[i].file = filename;
lock_info->locks[i].line_num = line_num;
lock_info->locks[i].func = func;