]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Improve the lock tracking code a bit so that a bunch of old locks that threads
authorRussell Bryant <russell@russellbryant.com>
Mon, 25 Feb 2008 23:19:05 +0000 (23:19 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 25 Feb 2008 23:19:05 +0000 (23:19 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.4@104102 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/utils.c

index 07669692fc058a8af838263025b9c5e4cde69708..f309d87a13182199b53f4b9ae394ba807eaae96d 100644 (file)
@@ -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;