astobj2: Record lock usage to refs log when DEBUG_THREADS is enabled.

When DEBUG_THREADS is enabled we can know if the astobj2 mutex / rwlock
was ever used, so it can be recorded in the REF_DEBUG destructor entry.

Create contrib/scripts/reflocks.py to process locking used by
allocator.  This can be used to identify places where
AO2_ALLOC_OPT_LOCK_NOLOCK should be used to reduce memory usage.

Change-Id: I2e3cd23336a97df2692b545f548fd79b14b53bf4
This commit is contained in:
Corey Farrell
2018-10-01 00:11:44 -04:00
parent 5ca5483fcb
commit 13df745278
3 changed files with 157 additions and 2 deletions

View File

@@ -473,6 +473,9 @@ int __ao2_ref(void *user_data, int delta,
int32_t current_value;
int32_t ret;
struct ao2_weakproxy *weakproxy = NULL;
#ifdef DEBUG_THREADS
const char *lock_state;
#endif
if (obj == NULL) {
if (ref_log && user_data) {
@@ -592,21 +595,33 @@ int __ao2_ref(void *user_data, int delta,
switch (obj->priv_data.options & AO2_ALLOC_OPT_LOCK_MASK) {
case AO2_ALLOC_OPT_LOCK_MUTEX:
obj_mutex = INTERNAL_OBJ_MUTEX(user_data);
#ifdef DEBUG_THREADS
lock_state = obj_mutex->mutex.lock.flags.setup ? "used" : "unused";
#endif
ast_mutex_destroy(&obj_mutex->mutex.lock);
ast_free(obj_mutex);
break;
case AO2_ALLOC_OPT_LOCK_RWLOCK:
obj_rwlock = INTERNAL_OBJ_RWLOCK(user_data);
#ifdef DEBUG_THREADS
lock_state = obj_rwlock->rwlock.lock.flags.setup ? "used" : "unused";
#endif
ast_rwlock_destroy(&obj_rwlock->rwlock.lock);
ast_free(obj_rwlock);
break;
case AO2_ALLOC_OPT_LOCK_NOLOCK:
#ifdef DEBUG_THREADS
lock_state = "none";
#endif
ast_free(obj);
break;
case AO2_ALLOC_OPT_LOCK_OBJ:
obj_lockobj = INTERNAL_OBJ_LOCKOBJ(user_data);
#ifdef DEBUG_THREADS
lock_state = "lockobj";
#endif
ao2_t_ref(obj_lockobj->lockobj.lock, -1, "release lockobj");
ast_free(obj_lockobj);
@@ -614,12 +629,22 @@ int __ao2_ref(void *user_data, int delta,
default:
ast_log(__LOG_ERROR, file, line, func,
"Invalid lock option on ao2 object %p\n", user_data);
#ifdef DEBUG_THREADS
lock_state = "invalid";
#endif
break;
}
if (ref_log && tag) {
fprintf(ref_log, "%p,%d,%d,%s,%d,%s,**destructor**,%s\n",
user_data, delta, ast_get_tid(), file, line, func, tag);
fprintf(ref_log, "%p,%d,%d,%s,%d,%s,**destructor%s%s**,%s\n",
user_data, delta, ast_get_tid(), file, line, func,
#ifdef DEBUG_THREADS
"**lock-state:",
lock_state,
#else
"", "",
#endif
tag);
fflush(ref_log);
}