[PATCH] Log time to acquire lock when mutex logging is in effect.

Martin Blix Grydeland martin at varnish-software.com
Mon Mar 12 10:21:43 CET 2012


The MTX_UNLOCK debug lines will log for how long this thread
held the lock.

The MTX_LOCK debug lines will log how long the thread waited for the
lock to be axquired.

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.
---
 bin/varnishd/cache/cache_lck.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/bin/varnishd/cache/cache_lck.c b/bin/varnishd/cache/cache_lck.c
index 9fb34ae..8b919d2 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,6 +64,7 @@ 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)) {
@@ -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 & 0x8)
+		t0 = VTIM_real();
 	r = pthread_mutex_trylock(&ilck->mtx);
 	assert(r == 0 || r == EBUSY);
 	if (r) {
@@ -80,8 +85,12 @@ Lck__Lock(struct lock *lck, const char *p, const char *f, int l)
 			VSL(SLT_Debug, 0, "MTX_CONTEST(%s,%s,%d,%s)",
 			    p, f, l, ilck->w);
 		AZ(pthread_mutex_lock(&ilck->mtx));
-	} 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 & 0x8) {
+		t = VTIM_real();
+		VSL(SLT_Debug, 0, "MTX_LOCK(%s,%s,%d,%s) %.9fs",
+		    p, f, l, ilck->w, t - t0);
+		ilck->t0 = t;
 	}
 	AZ(ilck->held);
 	ilck->stat->locks++;
@@ -110,8 +119,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)
-		VSL(SLT_Debug, 0, "MTX_UNLOCK(%s,%s,%d,%s)", p, f, l, ilck->w);
+	if (cache_param->diag_bitmap & 0x8) {
+		VSL(SLT_Debug, 0, "MTX_UNLOCK(%s,%s,%d,%s) %.9fs",
+		    p, f, l, ilck->w, VTIM_real() - ilck->t0);
+	}
 }
 
 int __match_proto__()
@@ -131,6 +142,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 & 0x8)
+			ilck->t0 = VTIM_real();
 	}
 	return (r);
 }
-- 
1.7.4.1




More information about the varnish-dev mailing list