[4.1] 9a71465 director VMODs use a rwlock for mutexing, add_backend() uses a wrlock, all other methods use rdlock

Lasse Karstensen lkarsten at varnish-software.com
Thu Jan 14 15:15:12 CET 2016


commit 9a7146509ed33cc1b54e031daddfe170ebd5f9ec
Author: Geoff Simmons <geoff at uplex.de>
Date:   Fri Jan 8 15:26:03 2016 +0100

    director VMODs use a rwlock for mutexing, add_backend() uses a wrlock,
    all other methods use rdlock

diff --git a/lib/libvmod_directors/fall_back.c b/lib/libvmod_directors/fall_back.c
index a47aa08..241a675 100644
--- a/lib/libvmod_directors/fall_back.c
+++ b/lib/libvmod_directors/fall_back.c
@@ -66,7 +66,7 @@ vmod_fallback_resolve(const struct director *dir, struct worker *wrk,
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_FALLBACK_MAGIC);
-	vdir_lock(rr->vd);
+	vdir_rdlock(rr->vd);
 	for (u = 0; u < rr->vd->n_backend; u++) {
 		be = rr->vd->backend[u];
 		CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
diff --git a/lib/libvmod_directors/round_robin.c b/lib/libvmod_directors/round_robin.c
index 3690893..75ca9e4 100644
--- a/lib/libvmod_directors/round_robin.c
+++ b/lib/libvmod_directors/round_robin.c
@@ -67,7 +67,7 @@ vmod_rr_resolve(const struct director *dir, struct worker *wrk,
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC);
-	vdir_lock(rr->vd);
+	vdir_rdlock(rr->vd);
 	for (u = 0; u < rr->vd->n_backend; u++) {
 		rr->nxt %= rr->vd->n_backend;
 		be = rr->vd->backend[rr->nxt];
diff --git a/lib/libvmod_directors/vdir.c b/lib/libvmod_directors/vdir.c
index 1112bad..5f2968a 100644
--- a/lib/libvmod_directors/vdir.c
+++ b/lib/libvmod_directors/vdir.c
@@ -63,7 +63,7 @@ vdir_new(struct vdir **vdp, const char *name, const char *vcl_name,
 	ALLOC_OBJ(vd, VDIR_MAGIC);
 	AN(vd);
 	*vdp = vd;
-	AZ(pthread_mutex_init(&vd->mtx, NULL));
+	AZ(pthread_rwlock_init(&vd->mtx, NULL));
 
 	ALLOC_OBJ(vd->dir, DIRECTOR_MAGIC);
 	AN(vd->dir);
@@ -89,7 +89,7 @@ vdir_delete(struct vdir **vdp)
 
 	free(vd->backend);
 	free(vd->weight);
-	AZ(pthread_mutex_destroy(&vd->mtx));
+	AZ(pthread_rwlock_destroy(&vd->mtx));
 	free(vd->dir->vcl_name);
 	FREE_OBJ(vd->dir);
 	vbit_destroy(vd->vbm);
@@ -97,17 +97,24 @@ vdir_delete(struct vdir **vdp)
 }
 
 void
-vdir_lock(struct vdir *vd)
+vdir_rdlock(struct vdir *vd)
 {
 	CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
-	AZ(pthread_mutex_lock(&vd->mtx));
+	AZ(pthread_rwlock_rdlock(&vd->mtx));
+}
+
+void
+vdir_wrlock(struct vdir *vd)
+{
+	CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
+	AZ(pthread_rwlock_wrlock(&vd->mtx));
 }
 
 void
 vdir_unlock(struct vdir *vd)
 {
 	CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
-	AZ(pthread_mutex_unlock(&vd->mtx));
+	AZ(pthread_rwlock_unlock(&vd->mtx));
 }
 
 
@@ -118,7 +125,7 @@ vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight)
 
 	CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
 	AN(be);
-	vdir_lock(vd);
+	vdir_wrlock(vd);
 	if (vd->n_backend >= vd->l_backend)
 		vdir_expand(vd, vd->l_backend + 16);
 	assert(vd->n_backend < vd->l_backend);
@@ -140,7 +147,7 @@ vdir_any_healthy(struct vdir *vd, const struct busyobj *bo, double *changed)
 
 	CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
 	CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC);
-	vdir_lock(vd);
+	vdir_rdlock(vd);
 	if (changed != NULL)
 		*changed = 0;
 	for (u = 0; u < vd->n_backend; u++) {
@@ -183,7 +190,7 @@ vdir_pick_be(struct vdir *vd, double w, const struct busyobj *bo)
 	double tw = 0.0;
 	VCL_BACKEND be = NULL;
 
-	vdir_lock(vd);
+	vdir_rdlock(vd);
 	for (u = 0; u < vd->n_backend; u++) {
 		if (vd->backend[u]->healthy(vd->backend[u], bo, NULL)) {
 			vbit_clr(vd->vbm, u);
diff --git a/lib/libvmod_directors/vdir.h b/lib/libvmod_directors/vdir.h
index b420f68..3a43cc2 100644
--- a/lib/libvmod_directors/vdir.h
+++ b/lib/libvmod_directors/vdir.h
@@ -31,7 +31,7 @@ struct vbitmap;
 struct vdir {
 	unsigned				magic;
 #define VDIR_MAGIC				0x99f4b726
-	pthread_mutex_t				mtx;
+	pthread_rwlock_t			mtx;
 	unsigned				n_backend;
 	unsigned				l_backend;
 	VCL_BACKEND				*backend;
@@ -44,7 +44,8 @@ struct vdir {
 void vdir_new(struct vdir **vdp, const char *name, const char *vcl_name,
     vdi_healthy_f *healthy, vdi_resolve_f *resolve, void *priv);
 void vdir_delete(struct vdir **vdp);
-void vdir_lock(struct vdir *vd);
+void vdir_rdlock(struct vdir *vd);
+void vdir_wrlock(struct vdir *vd);
 void vdir_unlock(struct vdir *vd);
 unsigned vdir_add_backend(struct vdir *, VCL_BACKEND be, double weight);
 unsigned vdir_any_healthy(struct vdir *, const struct busyobj *,



More information about the varnish-commit mailing list