diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h index a54f88368185303d8d011d4552b7129d762e3a6b..b3b3dbf98b145e75e95ba65af5fd9db58acb6ce7 100644 --- a/include/asterisk/linkedlists.h +++ b/include/asterisk/linkedlists.h @@ -359,6 +359,19 @@ struct { \ */ #define AST_LIST_TRAVERSE_SAFE_END } +/*! + \brief Initializes a list head structure. + \param head This is a pointer to the list head structure + + This macro initializes a list head structure by setting the head + entry to \a NULL (empty list) and recreating the embedded lock. +*/ +#define AST_LIST_HEAD_INIT(head) { \ + (head)->first = NULL; \ + (head)->last = NULL; \ + ast_mutex_init(&(head)->lock); \ +} + /*! \brief Destroys a list head structure. \param head This is a pointer to the list head structure diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h index 1ac5f4ba78071edd8cb39a91aaaaa1a75a46029b..904a7e64ec3183cb91ef539c0bd119ad488b7d86 100644 --- a/include/asterisk/lock.h +++ b/include/asterisk/lock.h @@ -149,6 +149,13 @@ typedef struct ast_mutex_info ast_mutex_t; typedef pthread_cond_t ast_cond_t; +static pthread_mutex_t empty_mutex; + +static void __attribute__((constructor)) init_empty_mutex(void) +{ + memset(&empty_mutex, 0, sizeof(empty_mutex)); +} + static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno, const char *func, const char *mutex_name, ast_mutex_t *t, pthread_mutexattr_t *attr) @@ -157,14 +164,16 @@ static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno int canlog = strcmp(filename, "logger.c"); if ((t->mutex) != ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) { - __ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is already initialized.\n", - filename, lineno, func, mutex_name); - __ast_mutex_logger("%s line %d (%s): Error: previously initialization of mutex '%s'.\n", - t->file[0], t->lineno[0], t->func[0], mutex_name); + if ((t->mutex) != (empty_mutex)) { + __ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is already initialized.\n", + filename, lineno, func, mutex_name); + __ast_mutex_logger("%s line %d (%s): Error: previously initialization of mutex '%s'.\n", + t->file[0], t->lineno[0], t->func[0], mutex_name); #ifdef THREAD_CRASH - DO_THREAD_CRASH; + DO_THREAD_CRASH; #endif - return 0; + return 0; + } } #endif