[asterisk-commits] rmudgett: branch rmudgett/debug_threads r428630 - /team/rmudgett/debug_thread...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Nov 24 18:13:50 CST 2014
Author: rmudgett
Date: Mon Nov 24 18:13:44 2014
New Revision: 428630
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=428630
Log:
* Defer lock tracking initialization until first use.
* No need to initialize tracking data in __ast_pthread_mutex_destroy()
just to turn around and destroy it. We shouldn't be trying to destroy the
lock if someone is still using it.
* Match ast_suspend_lock_info() with ast_restore_lock_info() in
__ast_cond_timedwait().
* Fix bad canlog initialization expressions.
Modified:
team/rmudgett/debug_threads/main/lock.c
Modified: team/rmudgett/debug_threads/main/lock.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/debug_threads/main/lock.c?view=diff&rev=428630&r1=428629&r2=428630
==============================================================================
--- team/rmudgett/debug_threads/main/lock.c (original)
+++ team/rmudgett/debug_threads/main/lock.c Mon Nov 24 18:13:44 2014
@@ -88,7 +88,6 @@
}
lt = *plt = ast_std_calloc(1, sizeof(*lt));
-
if (!lt) {
fprintf(stderr, "%s: Failed to allocate lock tracking\n", __func__);
#if defined(DO_CRASH) || defined(THREAD_CRASH)
@@ -111,6 +110,7 @@
static inline void delete_reentrancy_cs(struct ast_lock_track **plt)
{
struct ast_lock_track *lt;
+
if (*plt) {
lt = *plt;
pthread_mutex_destroy(<->reentr_mutex);
@@ -128,30 +128,27 @@
pthread_mutexattr_t attr;
#ifdef DEBUG_THREADS
- t->track = NULL;
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if ((t->mutex) != ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
/*
- int canlog = strcmp(filename, "logger.c") & track;
+ int canlog = tracking && strcmp(filename, "logger.c");
__ast_mutex_logger("%s line %d (%s): NOTICE: mutex '%s' is already initialized.\n",
filename, lineno, func, mutex_name);
DO_THREAD_CRASH;
*/
return 0;
}
-
#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
- if ((t->tracking = tracking)) {
- ast_get_reentrancy(&t->track);
- }
+ t->track = NULL;
+ t->tracking = tracking;
#endif /* DEBUG_THREADS */
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, AST_MUTEX_KIND);
-
res = pthread_mutex_init(&t->mutex, &attr);
pthread_mutexattr_destroy(&attr);
+
return res;
}
@@ -161,8 +158,8 @@
int res;
#ifdef DEBUG_THREADS
- struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ struct ast_lock_track *lt = t->track;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
@@ -177,10 +174,6 @@
return 0;
}
#endif
-
- if (t->tracking) {
- lt = ast_get_reentrancy(&t->track);
- }
res = pthread_mutex_trylock(&t->mutex);
switch (res) {
@@ -239,7 +232,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -376,7 +369,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -455,7 +448,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -565,7 +558,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
struct ast_lock_track lt_orig;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
@@ -621,8 +614,10 @@
DO_THREAD_CRASH;
} else if (lt) {
pthread_mutex_t reentr_mutex_orig;
+
ast_reentrancy_lock(lt);
/* Restore lock tracking to what it was prior to the wait */
+/* BUGBUG doing this to lt->reentr_mutex is bad the struct/union can change at any time. */
reentr_mutex_orig = lt->reentr_mutex;
*lt = lt_orig;
/* un-trash the mutex we just copied over */
@@ -645,7 +640,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
struct ast_lock_track lt_orig;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
@@ -701,15 +696,17 @@
DO_THREAD_CRASH;
} else if (lt) {
pthread_mutex_t reentr_mutex_orig;
+
ast_reentrancy_lock(lt);
/* Restore lock tracking to what it was prior to the wait */
+/* BUGBUG doing this to lt->reentr_mutex is bad the struct/union can change at any time. */
reentr_mutex_orig = lt->reentr_mutex;
*lt = lt_orig;
/* un-trash the mutex we just copied over */
lt->reentr_mutex = reentr_mutex_orig;
ast_reentrancy_unlock(lt);
- ast_suspend_lock_info(t);
+ ast_restore_lock_info(t);
}
#endif /* DEBUG_THREADS */
@@ -722,30 +719,27 @@
pthread_rwlockattr_t attr;
#ifdef DEBUG_THREADS
-
-#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
- int canlog = strcmp(filename, "logger.c") & t->tracking;
-
+#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if (t->lock != ((pthread_rwlock_t) __AST_RWLOCK_INIT_VALUE)) {
+ int canlog = tracking && strcmp(filename, "logger.c");
+
__ast_mutex_logger("%s line %d (%s): Warning: rwlock '%s' is already initialized.\n",
filename, lineno, func, rwlock_name);
return 0;
}
#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
- if ((t->tracking = tracking)) {
- ast_get_reentrancy(&t->track);
- }
+ t->track = NULL;
+ t->tracking = tracking;
#endif /* DEBUG_THREADS */
pthread_rwlockattr_init(&attr);
-
#ifdef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP
pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP);
#endif
-
res = pthread_rwlock_init(&t->lock, &attr);
pthread_rwlockattr_destroy(&attr);
+
return res;
}
@@ -755,7 +749,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = t->track;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if (t->lock == ((pthread_rwlock_t) __AST_RWLOCK_INIT_VALUE)) {
@@ -764,7 +758,6 @@
return 0;
}
#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
-
#endif /* DEBUG_THREADS */
res = pthread_rwlock_destroy(&t->lock);
@@ -798,12 +791,11 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
int lock_found = 0;
-
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
if ((t->lock) == ((pthread_rwlock_t) __AST_RWLOCK_INIT_VALUE)) {
@@ -883,7 +875,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -1007,7 +999,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -1131,7 +1123,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -1239,7 +1231,7 @@
#ifdef DEBUG_THREADS
struct ast_lock_track *lt = NULL;
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
#ifdef HAVE_BKTR
struct ast_bt *bt = NULL;
#endif
@@ -1350,7 +1342,7 @@
struct ast_bt *bt = NULL;
#endif
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
if ((t->lock) == ((pthread_rwlock_t) __AST_RWLOCK_INIT_VALUE)) {
/* Don't warn abount uninitialized lock.
@@ -1425,7 +1417,7 @@
struct ast_bt *bt = NULL;
#endif
#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS) && defined(CAN_COMPARE_MUTEX_TO_INIT_VALUE)
- int canlog = strcmp(filename, "logger.c") & t->tracking;
+ int canlog = t->tracking && strcmp(filename, "logger.c");
if ((t->lock) == ((pthread_rwlock_t) __AST_RWLOCK_INIT_VALUE)) {
/* Don't warn abount uninitialized lock.
More information about the asterisk-commits
mailing list