mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 03:20:57 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user