@ -51,8 +51,23 @@ struct tls_object {
} ;
static AST_LIST_HEAD_NOLOCK_STATIC ( tls_objects , tls_object ) ;
AST_MUTEX_DEFINE_STATIC_NOTRACKING ( threadstoragelock ) ;
/* Allow direct use of pthread_mutex_t and friends */
# undef pthread_mutex_t
# undef pthread_mutex_lock
# undef pthread_mutex_unlock
# undef pthread_mutex_init
# undef pthread_mutex_destroy
/*!
* \ brief lock for the tls_objects list
*
* \ note We can not use an ast_mutex_t for this . The reason is that this
* lock is used within the context of thread - local data destructors ,
* and the ast_mutex_ * API uses thread - local data . Allocating more
* thread - local data at that point just causes a memory leak .
*/
static pthread_mutex_t threadstoragelock ;
void __ast_threadstorage_object_add ( void * key , size_t len , const char * file , const char * function , unsigned int line )
{
@ -68,16 +83,16 @@ void __ast_threadstorage_object_add(void *key, size_t len, const char *file, con
to - > line = line ;
to - > thread = pthread_self ( ) ;
ast _mutex_lock( & threadstoragelock ) ;
pthread _mutex_lock( & threadstoragelock ) ;
AST_LIST_INSERT_TAIL ( & tls_objects , to , entry ) ;
ast _mutex_unlock( & threadstoragelock ) ;
pthread _mutex_unlock( & threadstoragelock ) ;
}
void __ast_threadstorage_object_remove ( void * key )
{
struct tls_object * to ;
ast _mutex_lock( & threadstoragelock ) ;
pthread _mutex_lock( & threadstoragelock ) ;
AST_LIST_TRAVERSE_SAFE_BEGIN ( & tls_objects , to , entry ) {
if ( to - > key = = key ) {
AST_LIST_REMOVE_CURRENT ( & tls_objects , entry ) ;
@ -85,7 +100,7 @@ void __ast_threadstorage_object_remove(void *key)
}
}
AST_LIST_TRAVERSE_SAFE_END ;
ast _mutex_unlock( & threadstoragelock ) ;
pthread _mutex_unlock( & threadstoragelock ) ;
if ( to )
free ( to ) ;
}
@ -94,7 +109,7 @@ void __ast_threadstorage_object_replace(void *key_old, void *key_new, size_t len
{
struct tls_object * to ;
ast _mutex_lock( & threadstoragelock ) ;
pthread _mutex_lock( & threadstoragelock ) ;
AST_LIST_TRAVERSE_SAFE_BEGIN ( & tls_objects , to , entry ) {
if ( to - > key = = key_old ) {
to - > key = key_new ;
@ -103,7 +118,7 @@ void __ast_threadstorage_object_replace(void *key_old, void *key_new, size_t len
}
}
AST_LIST_TRAVERSE_SAFE_END ;
ast _mutex_unlock( & threadstoragelock ) ;
pthread _mutex_unlock( & threadstoragelock ) ;
}
static int handle_show_allocations ( int fd , int argc , char * argv [ ] )
@ -116,7 +131,7 @@ static int handle_show_allocations(int fd, int argc, char *argv[])
if ( argc > 3 )
fn = argv [ 3 ] ;
ast _mutex_lock( & threadstoragelock ) ;
pthread _mutex_lock( & threadstoragelock ) ;
AST_LIST_TRAVERSE ( & tls_objects , to , entry ) {
if ( fn & & strcasecmp ( to - > file , fn ) )
@ -128,7 +143,7 @@ static int handle_show_allocations(int fd, int argc, char *argv[])
count + + ;
}
ast _mutex_unlock( & threadstoragelock ) ;
pthread _mutex_unlock( & threadstoragelock ) ;
ast_cli ( fd , " %10d bytes allocated in %d allocation%s \n " , ( int ) len , count , count > 1 ? " s " : " " ) ;
@ -152,7 +167,7 @@ static int handle_show_summary(int fd, int argc, char *argv[])
if ( argc > 3 )
fn = argv [ 3 ] ;
ast _mutex_lock( & threadstoragelock ) ;
pthread _mutex_lock( & threadstoragelock ) ;
AST_LIST_TRAVERSE ( & tls_objects , to , entry ) {
if ( fn & & strcasecmp ( to - > file , fn ) )
@ -174,7 +189,7 @@ static int handle_show_summary(int fd, int argc, char *argv[])
file - > count + + ;
}
ast _mutex_unlock( & threadstoragelock ) ;
pthread _mutex_unlock( & threadstoragelock ) ;
AST_LIST_TRAVERSE ( & file_summary , file , entry ) {
len + = file - > len ;
@ -216,6 +231,7 @@ static struct ast_cli_entry cli[] = {
void threadstorage_init ( void )
{
pthread_mutex_init ( & threadstoragelock , NULL ) ;
ast_cli_register_multiple ( cli , sizeof ( cli ) / sizeof ( cli [ 0 ] ) ) ;
}