[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