[master] 4f3ed52 Add an intersticial struct between vcl and directors
Poul-Henning Kamp
phk at FreeBSD.org
Wed Apr 25 08:27:16 UTC 2018
commit 4f3ed523166cf41ac84fb52d27fc059d5229d3de
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Apr 25 06:50:41 2018 +0000
Add an intersticial struct between vcl and directors
diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 5a9cb60..43e7e4b 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -37,6 +37,8 @@
*
*/
+struct vcldir;
+
typedef unsigned vdi_healthy_f(const struct director *, const struct busyobj *,
double *changed);
/* XXX need a VRT_CTX argument */
@@ -84,9 +86,9 @@ struct director {
/* Internal Housekeeping fields */
+ struct vcldir *vdir;
+
char *cli_name;
- VTAILQ_ENTRY(director) vcl_list;
- struct vcl *vcl;
unsigned health;
const struct vdi_ahealth *admin_health;
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index 2e17896..7ca458c 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -224,13 +224,13 @@ vcl_iterdir(struct cli *cli, const char *pat, const struct vcl *vcl,
vcl_be_func *func, void *priv)
{
int i, found = 0;
- struct director *d;
+ struct vcldir *vdir;
- VTAILQ_FOREACH(d, &vcl->director_list, vcl_list) {
- if (fnmatch(pat, d->cli_name, 0))
+ VTAILQ_FOREACH(vdir, &vcl->director_list, list) {
+ if (fnmatch(pat, vdir->dir->cli_name, 0))
continue;
found++;
- i = func(cli, d, priv);
+ i = func(cli, vdir->dir, priv);
if (i < 0)
return (i);
found += i;
@@ -285,32 +285,33 @@ VCL_IterDirector(struct cli *cli, const char *pat,
static void
vcl_BackendEvent(const struct vcl *vcl, enum vcl_event_e e)
{
- struct director *d;
+ struct vcldir *vdir;
ASSERT_CLI();
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
AZ(vcl->busy);
- VTAILQ_FOREACH(d, &vcl->director_list, vcl_list)
- VDI_Event(d, e);
+ VTAILQ_FOREACH(vdir, &vcl->director_list, list)
+ VDI_Event(vdir->dir, e);
}
static void
vcl_KillBackends(struct vcl *vcl)
{
- struct director *d;
+ struct vcldir *vdir;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
AZ(vcl->busy);
assert(VTAILQ_EMPTY(&vcl->ref_list));
while (1) {
- d = VTAILQ_FIRST(&vcl->director_list);
- if (d == NULL)
+ vdir = VTAILQ_FIRST(&vcl->director_list);
+ if (vdir == NULL)
break;
- VTAILQ_REMOVE(&vcl->director_list, d, vcl_list);
- AN(d->destroy);
- REPLACE(d->cli_name, NULL);
- d->destroy(d);
+ VTAILQ_REMOVE(&vcl->director_list, vdir, list);
+ REPLACE(vdir->dir->cli_name, NULL);
+ AN(vdir->dir->destroy);
+ vdir->dir->destroy(vdir->dir);
+ FREE_OBJ(vdir);
}
}
diff --git a/bin/varnishd/cache/cache_vcl.h b/bin/varnishd/cache/cache_vcl.h
index f0789a8..e5a5453 100644
--- a/bin/varnishd/cache/cache_vcl.h
+++ b/bin/varnishd/cache/cache_vcl.h
@@ -35,6 +35,14 @@ struct vfp_filter;
VTAILQ_HEAD(vfp_filter_head, vfp_filter);
+struct vcldir {
+ unsigned magic;
+#define VCLDIR_MAGIC 0xbf726c7d
+ struct director *dir;
+ struct vcl *vcl;
+ VTAILQ_ENTRY(vcldir) list;
+};
+
struct vcl {
unsigned magic;
#define VCL_MAGIC 0x214188f2
@@ -47,7 +55,7 @@ struct vcl {
unsigned discard;
const char *temp;
pthread_rwlock_t temp_rwl;
- VTAILQ_HEAD(,director) director_list;
+ VTAILQ_HEAD(,vcldir) director_list;
VTAILQ_HEAD(,vclref) ref_list;
int nrefs;
struct vcl *label;
diff --git a/bin/varnishd/cache/cache_vcl_vrt.c b/bin/varnishd/cache/cache_vcl_vrt.c
index ca45c76..0848a56 100644
--- a/bin/varnishd/cache/cache_vcl_vrt.c
+++ b/bin/varnishd/cache/cache_vcl_vrt.c
@@ -130,13 +130,20 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *vcl_name)
{
struct vsb *vsb;
struct vcl *vcl;
+ struct vcldir *vdir;
+ CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
vcl = ctx->vcl;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
- CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
AN(d->destroy);
- d->admin_health = VDI_AH_PROBE;
+ AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
+ if (vcl->temp == VCL_TEMP_COOLING) {
+ AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
+ return (1);
+ }
+
+ d->admin_health = VDI_AH_PROBE;
vsb = VSB_new_auto();
AN(vsb);
VSB_printf(vsb, "%s.%s", VCL_Name(vcl), vcl_name);
@@ -144,15 +151,14 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *vcl_name)
REPLACE((d->cli_name), VSB_data(vsb));
VSB_destroy(&vsb);
- AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
- if (vcl->temp == VCL_TEMP_COOLING) {
- AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
- return (1);
- }
+ ALLOC_OBJ(vdir, VCLDIR_MAGIC);
+ AN(vdir);
+ vdir->dir = d;
+ vdir->vcl = vcl;
+ d->vdir = vdir;
Lck_Lock(&vcl_mtx);
- VTAILQ_INSERT_TAIL(&vcl->director_list, d, vcl_list);
- d->vcl = vcl;
+ VTAILQ_INSERT_TAIL(&vcl->director_list, vdir, list);
Lck_Unlock(&vcl_mtx);
if (VCL_WARM(vcl))
@@ -169,13 +175,16 @@ void
VRT_DelDirector(VRT_CTX, struct director *d)
{
struct vcl *vcl;
+ struct vcldir *vdir;
(void)ctx;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
- vcl = d->vcl;
+ vdir = d->vdir;
+ CHECK_OBJ_NOTNULL(vdir, VCLDIR_MAGIC);
+ vcl = vdir->vcl;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
Lck_Lock(&vcl_mtx);
- VTAILQ_REMOVE(&vcl->director_list, d, vcl_list);
+ VTAILQ_REMOVE(&vcl->director_list, vdir, list);
Lck_Unlock(&vcl_mtx);
AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
@@ -185,6 +194,7 @@ VRT_DelDirector(VRT_CTX, struct director *d)
AN(d->destroy);
REPLACE(d->cli_name, NULL);
d->destroy(d);
+ FREE_OBJ(vdir);
}
/*--------------------------------------------------------------------*/
More information about the varnish-commit
mailing list