[prev in list] [next in list] [prev in thread] [next in thread] 

List:       varnish-dev
Subject:    [PATCH] director VMODs use a rwlock for mutexing, add_backend() uses a wrlock, all other methods use
From:       Geoff Simmons <geoff () uplex ! de>
Date:       2015-12-04 15:19:41
Message-ID: 5661AF0D.6080708 () uplex ! de
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Hello all,

As agreed at VDD today.


Best,
Geoff
-- 
** * * UPLEX - Nils Goroll Systemoptimierung

Scheffelstraße 32
22301 Hamburg

Tel +49 40 2880 5731
Mob +49 176 636 90917
Fax +49 40 42949753

http://uplex.de

["0001-director-VMODs-use-a-rwlock-for-mutexing-add_backend.patch" (text/x-patch)]

From 7f0a652518420504c4123fc767d1c2686c54d102 Mon Sep 17 00:00:00 2001
From: Geoff Simmons <geoff@uplex.de>
Date: Fri, 4 Dec 2015 16:08:50 +0100
Subject: [PATCH] director VMODs use a rwlock for mutexing, add_backend() uses
 a wrlock, all other methods us rdlock

---
 lib/libvmod_directors/fall_back.c   |  2 +-
 lib/libvmod_directors/round_robin.c |  2 +-
 lib/libvmod_directors/vdir.c        | 23 +++++++++++++++--------
 lib/libvmod_directors/vdir.h        |  5 +++--
 4 files changed, 20 insertions(+), 12 deletions(-)

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 411df34..09d904a 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)
 	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], NULL, NULL)) {
 			vbit_clr(vd->vbm, u);
diff --git a/lib/libvmod_directors/vdir.h b/lib/libvmod_directors/vdir.h
index 2e1cfe1..81cc3fa 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 *,
-- 
2.1.4


["signature.asc" (application/pgp-signature)]

_______________________________________________
varnish-dev mailing list
varnish-dev@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic