[master] d74bc62 Add a mutex timing flag to diag_bitmap

Martin Blix Grydeland martin at varnish-cache.org
Tue Mar 13 15:50:52 CET 2012


commit d74bc62ea6173ed270b58c2da0c97c52323eec0b
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Mon Mar 12 10:14:45 2012 +0100

    Add a mutex timing flag to diag_bitmap
    
    The MTX_UNLOCK debug lines will log for how long this thread
    held the lock.
    
    The MTX_LOCKWAIT debug lines will log how long the thread waited for the
    lock to be acquired.
    
    Bugs: Threads unlocking the mutex as part of pthread_cond_wait will
    not update the time of lock value for that mutex on pthread_cond_wait
    entry.

diff --git a/bin/varnishd/cache/cache_lck.c b/bin/varnishd/cache/cache_lck.c
index 9fb34ae..3bbbfbb 100644
--- a/bin/varnishd/cache/cache_lck.c
+++ b/bin/varnishd/cache/cache_lck.c
@@ -37,6 +37,7 @@
 
 #include <stdlib.h>
 
+#include "vtim.h"
 #include "cache.h"
 
 /*The constability of lck depends on platform pthreads implementation */
@@ -47,6 +48,7 @@ struct ilck {
 	pthread_mutex_t		mtx;
 	int			held;
 	pthread_t		owner;
+	double			t0;
 	VTAILQ_ENTRY(ilck)	list;
 	const char		*w;
 	struct VSC_C_lck	*stat;
@@ -62,9 +64,10 @@ Lck__Lock(struct lock *lck, const char *p, const char *f, int l)
 {
 	struct ilck *ilck;
 	int r;
+	double t0, t;
 
 	CAST_OBJ_NOTNULL(ilck, lck->priv, ILCK_MAGIC);
-	if (!(cache_param->diag_bitmap & 0x18)) {
+	if (!(cache_param->diag_bitmap & 0x98)) {
 		AZ(pthread_mutex_lock(&ilck->mtx));
 		AZ(ilck->held);
 		ilck->stat->locks++;
@@ -72,6 +75,8 @@ Lck__Lock(struct lock *lck, const char *p, const char *f, int l)
 		ilck->held = 1;
 		return;
 	}
+	if (cache_param->diag_bitmap & 0x80)
+		t0 = VTIM_real();
 	r = pthread_mutex_trylock(&ilck->mtx);
 	assert(r == 0 || r == EBUSY);
 	if (r) {
@@ -83,6 +88,12 @@ Lck__Lock(struct lock *lck, const char *p, const char *f, int l)
 	} else if (cache_param->diag_bitmap & 0x8) {
 		VSL(SLT_Debug, 0, "MTX_LOCK(%s,%s,%d,%s)", p, f, l, ilck->w);
 	}
+	if (cache_param->diag_bitmap & 0x80) {
+		t = VTIM_real();
+		VSL(SLT_Debug, 0, "MTX_LOCKWAIT(%s,%s,%d,%s) %.9fs",
+		    p, f, l, ilck->w, t - t0);
+		ilck->t0 = t;
+	}
 	AZ(ilck->held);
 	ilck->stat->locks++;
 	ilck->owner = pthread_self();
@@ -110,7 +121,10 @@ Lck__Unlock(struct lock *lck, const char *p, const char *f, int l)
 	 */
 	memset(&ilck->owner, 0, sizeof ilck->owner);
 	AZ(pthread_mutex_unlock(&ilck->mtx));
-	if (cache_param->diag_bitmap & 0x8)
+	if (cache_param->diag_bitmap & 0x80)
+		VSL(SLT_Debug, 0, "MTX_UNLOCK(%s,%s,%d,%s) %.9fs",
+		    p, f, l, ilck->w, VTIM_real() - ilck->t0);
+	else if (cache_param->diag_bitmap & 0x8)
 		VSL(SLT_Debug, 0, "MTX_UNLOCK(%s,%s,%d,%s)", p, f, l, ilck->w);
 }
 
@@ -131,6 +145,8 @@ Lck__Trylock(struct lock *lck, const char *p, const char *f, int l)
 		ilck->held = 1;
 		ilck->stat->locks++;
 		ilck->owner = pthread_self();
+		if (cache_param->diag_bitmap & 0x80)
+			ilck->t0 = VTIM_real();
 	}
 	return (r);
 }
diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c
index 31ef010..f6493ad 100644
--- a/bin/varnishd/mgt/mgt_param.c
+++ b/bin/varnishd/mgt/mgt_param.c
@@ -1060,6 +1060,7 @@ static const struct parspec input_parspec[] = {
 		"  0x00000010 - mutex contests.\n"
 		"  0x00000020 - waiting list.\n"
 		"  0x00000040 - object workspace.\n"
+		"  0x00000080 - mutex timing.\n"
 		"  0x00001000 - do not core-dump child process.\n"
 		"  0x00002000 - only short panic message.\n"
 		"  0x00004000 - panic to stderr.\n"
@@ -1069,7 +1070,11 @@ static const struct parspec input_parspec[] = {
 		"  0x00080000 - ban-lurker debugging.\n"
 		"  0x80000000 - do edge-detection on digest.\n"
 		"\n"
-		"Use 0x notation and do the bitor in your head :-)\n",
+		"Use 0x notation and do the bitor in your head :-)\n"
+		"\n"
+		"Note: Mutex timing will add extra overhead and "
+		"synchronization between threads, consequently changing the "
+		"locking characteristics.\n",
 		0,
 		"0", "bitmap" },
 	{ "ban_dups", tweak_bool, &mgt_param.ban_dups, 0, 0,



More information about the varnish-commit mailing list