restore AST_LIST_HEAD_INIT (with no users in the tree right now)
authorKevin P. Fleming <kpfleming@digium.com>
Tue, 23 May 2006 17:04:07 +0000 (17:04 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Tue, 23 May 2006 17:04:07 +0000 (17:04 +0000)
update ast_mutex_init to allow mutexes that are all zero bytes to be initialized (in the case of a dynamically-allocated structure containing a mutex)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29727 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/linkedlists.h
include/asterisk/lock.h

index a54f883..b3b3dbf 100644 (file)
@@ -360,6 +360,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
 
index 1ac5f4b..904a7e6 100644 (file)
@@ -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