[asterisk-commits] russell: branch russell/debug_threads r77880 - in /team/russell/debug_threads...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Aug 1 15:14:32 CDT 2007


Author: russell
Date: Wed Aug  1 15:14:31 2007
New Revision: 77880

URL: http://svn.digium.com/view/asterisk?view=rev&rev=77880
Log:
Fix the combination of MALLOC_DEBUG and DEBUG_THREADS.  The replacement malloc
routines use a mutex, and the mutex tracking code allocates memory, which
caused infinite recursion.

Modified:
    team/russell/debug_threads/astmm.c
    team/russell/debug_threads/include/asterisk/lock.h

Modified: team/russell/debug_threads/astmm.c
URL: http://svn.digium.com/view/asterisk/team/russell/debug_threads/astmm.c?view=diff&rev=77880&r1=77879&r2=77880
==============================================================================
--- team/russell/debug_threads/astmm.c (original)
+++ team/russell/debug_threads/astmm.c Wed Aug  1 15:14:31 2007
@@ -75,7 +75,7 @@
 #define HASH(a) \
 	(((unsigned long)(a)) % SOME_PRIME)
 	
-AST_MUTEX_DEFINE_STATIC(reglock);
+AST_MUTEX_DEFINE_STATIC_NOTRACKING(reglock);
 AST_MUTEX_DEFINE_STATIC(showmemorylock);
 
 static inline void *__ast_alloc_region(size_t size, int which, const char *file, int lineno, const char *func)

Modified: team/russell/debug_threads/include/asterisk/lock.h
URL: http://svn.digium.com/view/asterisk/team/russell/debug_threads/include/asterisk/lock.h?view=diff&rev=77880&r1=77879&r2=77880
==============================================================================
--- team/russell/debug_threads/include/asterisk/lock.h (original)
+++ team/russell/debug_threads/include/asterisk/lock.h Wed Aug  1 15:14:31 2007
@@ -80,12 +80,15 @@
 #include <stdio.h>
 #include <unistd.h>
 
-#define AST_MUTEX_INIT_VALUE { PTHREAD_MUTEX_INIT_VALUE, { NULL }, { 0 }, 0, { NULL }, { 0 } }
+#define AST_MUTEX_INIT_VALUE { PTHREAD_MUTEX_INIT_VALUE, 1, { NULL }, { 0 }, 0, { NULL }, { 0 } }
+#define AST_MUTEX_INIT_VALUE_NOTRACKING \
+                             { PTHREAD_MUTEX_INIT_VALUE, 0, { NULL }, { 0 }, 0, { NULL }, { 0 } }
 
 #define AST_MAX_REENTRANCY 10
 
 struct ast_mutex_info {
 	pthread_mutex_t mutex;
+	unsigned int track:1;
 	const char *file[AST_MAX_REENTRANCY];
 	int lineno[AST_MAX_REENTRANCY];
 	int reentrancy;
@@ -192,8 +195,8 @@
 #if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)
 /* if AST_MUTEX_INIT_W_CONSTRUCTORS is defined, use file scope
  constrictors/destructors to create/destroy mutexes.  */
-#define __AST_MUTEX_DEFINE(scope,mutex) \
-	scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE; \
+#define __AST_MUTEX_DEFINE(scope,mutex,init_val) \
+	scope ast_mutex_t mutex = init_val; \
 static void  __attribute__ ((constructor)) init_##mutex(void) \
 { \
 	ast_mutex_init(&mutex); \
@@ -208,12 +211,12 @@
  the pthreads library does this itself to initialize errror checking
  (defaulty type) mutexes.  If nither is defined, the pthreads librariy
  does the initialization itself on first use. */ 
-#define __AST_MUTEX_DEFINE(scope,mutex) \
-	scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
+#define __AST_MUTEX_DEFINE(scope,mutex,init_val) \
+	scope ast_mutex_t mutex = init_val
 #else /* AST_MUTEX_INIT_W_CONSTRUCTORS */
 /* By default, use static initialization of mutexes.*/ 
-#define __AST_MUTEX_DEFINE(scope,mutex) \
-	scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
+#define __AST_MUTEX_DEFINE(scope,mutex,init_val) \
+	scope ast_mutex_t mutex = init_val
 #endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
 
 void ast_store_lock_info(const char *filename, int line_num, 
@@ -229,7 +232,8 @@
 	int res;
 	int canlog = strcmp(filename, "logger.c");
 
-	ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
+	if (t->track)
+		ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
 
 #if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) || defined(AST_MUTEX_INIT_ON_FIRST_USE)
 	if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
@@ -265,7 +269,8 @@
 #endif /* DETECT_DEADLOCKS */
 
 	if (!res) {
-		ast_mark_lock_acquired();
+		if (t->track)
+			ast_mark_lock_acquired();
 		if (t->reentrancy < AST_MAX_REENTRANCY) {
 			t->file[t->reentrancy] = filename;
 			t->lineno[t->reentrancy] = lineno;
@@ -277,7 +282,8 @@
 							   filename, lineno, func, mutex_name);
 		}
 	} else {
-		ast_remove_lock_info(&t->mutex);
+		if (t->track)
+			ast_remove_lock_info(&t->mutex);
 		__ast_mutex_logger("%s line %d (%s): Error obtaining mutex: %s\n",
 				   filename, lineno, func, strerror(res));
 #ifdef THREAD_CRASH
@@ -305,10 +311,12 @@
 	}
 #endif /* defined(AST_MUTEX_INIT_W_CONSTRUCTORS) || defined(AST_MUTEX_INIT_ON_FIRST_USE) */
 
-	ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
+	if (t->track)
+		ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
 
 	if (!(res = pthread_mutex_trylock(&t->mutex))) {
-		ast_mark_lock_acquired();
+		if (t->track)
+			ast_mark_lock_acquired();
 		if (t->reentrancy < AST_MAX_REENTRANCY) {
 			t->file[t->reentrancy] = filename;
 			t->lineno[t->reentrancy] = lineno;
@@ -319,7 +327,7 @@
 			__ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",
 							   filename, lineno, func, mutex_name);
 		}
-	} else {
+	} else if (t->track) {
 		ast_remove_lock_info(&t->mutex);
 	}
 
@@ -362,7 +370,8 @@
 		t->thread[t->reentrancy] = 0;
 	}
 
-	ast_remove_lock_info(&t->mutex);
+	if (t->track)
+		ast_remove_lock_info(&t->mutex);
 
 	if ((res = pthread_mutex_unlock(&t->mutex))) {
 		__ast_mutex_logger("%s line %d (%s): Error releasing mutex: %s\n", 
@@ -440,7 +449,8 @@
 		t->thread[t->reentrancy] = 0;
 	}
 
-	ast_remove_lock_info(&t->mutex);
+	if (t->track)
+		ast_remove_lock_info(&t->mutex);
 	if ((res = pthread_cond_wait(cond, &t->mutex))) {
 		__ast_mutex_logger("%s line %d (%s): Error waiting on condition mutex '%s'\n", 
 				   filename, lineno, func, strerror(res));
@@ -448,7 +458,8 @@
 		DO_THREAD_CRASH;
 #endif
 	} else {
-		ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
+		if (t->track)
+			ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
 		if (t->reentrancy < AST_MAX_REENTRANCY) {
 			t->file[t->reentrancy] = filename;
 			t->lineno[t->reentrancy] = lineno;
@@ -505,7 +516,8 @@
 		t->thread[t->reentrancy] = 0;
 	}
 
-	ast_remove_lock_info(&t->mutex);
+	if (t->track)
+		ast_remove_lock_info(&t->mutex);
 	if ((res = pthread_cond_timedwait(cond, &t->mutex, abstime)) && (res != ETIMEDOUT)) {
 		__ast_mutex_logger("%s line %d (%s): Error waiting on condition mutex '%s'\n", 
 				   filename, lineno, func, strerror(res));
@@ -513,7 +525,8 @@
 		DO_THREAD_CRASH;
 #endif
 	} else {
-		ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
+		if (t->track)
+			ast_store_lock_info(filename, lineno, func, mutex_name, &t->mutex);
 		if (t->reentrancy < AST_MAX_REENTRANCY) {
 			t->file[t->reentrancy] = filename;
 			t->lineno[t->reentrancy] = lineno;
@@ -544,7 +557,8 @@
 #else /* !DEBUG_THREADS */
 
 
-#define AST_MUTEX_INIT_VALUE	PTHREAD_MUTEX_INIT_VALUE
+#define AST_MUTEX_INIT_VALUE            PTHREAD_MUTEX_INIT_VALUE
+#define AST_MUTEX_INIT_VALUE_NOTRACKING PTHREAD_MUTEX_INIT_VALUE
 
 
 typedef pthread_mutex_t ast_mutex_t;
@@ -572,8 +586,8 @@
 #if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)
 /* if AST_MUTEX_INIT_W_CONSTRUCTORS is defined, use file scope
  constrictors/destructors to create/destroy mutexes.  */ 
-#define __AST_MUTEX_DEFINE(scope,mutex) \
-	scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE; \
+#define __AST_MUTEX_DEFINE(scope,mutex,init_val) \
+	scope ast_mutex_t mutex = init_val; \
 static void  __attribute__ ((constructor)) init_##mutex(void) \
 { \
 	ast_mutex_init(&mutex); \
@@ -598,8 +612,8 @@
  first use.  The performance impact on FreeBSD should be small since
  the pthreads library does this itself to initialize errror checking
  (defaulty type) mutexes.*/ 
-#define __AST_MUTEX_DEFINE(scope,mutex) \
-	scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
+#define __AST_MUTEX_DEFINE(scope,mutex,init_val) \
+	scope ast_mutex_t mutex = init_val
 
 static inline int ast_mutex_lock(ast_mutex_t *pmutex)
 {
@@ -615,8 +629,8 @@
 }
 #else
 /* By default, use static initialization of mutexes.*/ 
-#define __AST_MUTEX_DEFINE(scope,mutex) \
-	scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
+#define __AST_MUTEX_DEFINE(scope,mutex,init_val) \
+	scope ast_mutex_t mutex = init_val
 
 static inline int ast_mutex_lock(ast_mutex_t *pmutex)
 {
@@ -678,8 +692,9 @@
 #define pthread_cond_wait use_ast_cond_wait_instead_of_pthread_cond_wait
 #define pthread_cond_timedwait use_ast_cond_wait_instead_of_pthread_cond_timedwait
 
-#define AST_MUTEX_DEFINE_STATIC(mutex) __AST_MUTEX_DEFINE(static,mutex)
-#define AST_MUTEX_DEFINE_EXPORTED(mutex) __AST_MUTEX_DEFINE(/**/,mutex)
+#define AST_MUTEX_DEFINE_STATIC(mutex) __AST_MUTEX_DEFINE(static,mutex,AST_MUTEX_INIT_VALUE)
+#define AST_MUTEX_DEFINE_STATIC_NOTRACKING(mutex) __AST_MUTEX_DEFINE(static,mutex,AST_MUTEX_INIT_VALUE_NOTRACKING)
+#define AST_MUTEX_DEFINE_EXPORTED(mutex) __AST_MUTEX_DEFINE(/**/,mutex,AST_MUTEX_INIT_VALUE)
 
 #define AST_MUTEX_INITIALIZER __use_AST_MUTEX_DEFINE_STATIC_rather_than_AST_MUTEX_INITIALIZER__
 




More information about the asterisk-commits mailing list