[master] 947147ee6 Polishing/Refactoring
Poul-Henning Kamp
phk at FreeBSD.org
Tue Aug 13 11:10:10 UTC 2019
commit 947147ee65a8b6ea8e6ff1a52810b5604490ee0a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Aug 13 09:47:10 2019 +0000
Polishing/Refactoring
diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index 79411d783..13ccf67bb 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -82,6 +82,7 @@ struct vsm_seg {
#define VSM_FLAG_STALE (1U<<2)
#define VSM_FLAG_CLUSTER (1U<<3)
VTAILQ_ENTRY(vsm_seg) list;
+ VTAILQ_ENTRY(vsm_seg) clist;
struct vsm_set *set;
struct vsm_seg *cluster;
char **av;
@@ -233,18 +234,26 @@ vsm_unmapseg(struct vsm_seg *vg)
/*--------------------------------------------------------------------*/
static void
-vsm_delseg(struct vsm_seg *vg)
+vsm_delseg(struct vsm_seg *vg, int refsok)
{
CHECK_OBJ_NOTNULL(vg, VSM_SEG_MAGIC);
+ if (refsok && vg->refs) {
+ AZ(vg->flags & VSM_FLAG_STALE);
+ vg->flags |= VSM_FLAG_STALE;
+ VTAILQ_REMOVE(&vg->set->segs, vg, list);
+ VTAILQ_INSERT_TAIL(&vg->set->stale, vg, list);
+ return;
+ }
+
if (vg->s != NULL)
vsm_unmapseg(vg);
if (vg->flags & VSM_FLAG_STALE)
VTAILQ_REMOVE(&vg->set->stale, vg, list);
else if (vg->flags & VSM_FLAG_CLUSTER)
- VTAILQ_REMOVE(&vg->set->clusters, vg, list);
+ VTAILQ_REMOVE(&vg->set->clusters, vg, clist);
else
VTAILQ_REMOVE(&vg->set->segs, vg, list);
VAV_Free(vg->av);
@@ -281,11 +290,11 @@ vsm_delset(struct vsm_set **p)
if (vs->dfd >= 0)
closefd(&vs->dfd);
while (!VTAILQ_EMPTY(&vs->stale))
- vsm_delseg(VTAILQ_FIRST(&vs->stale));
+ vsm_delseg(VTAILQ_FIRST(&vs->stale), 0);
while (!VTAILQ_EMPTY(&vs->segs))
- vsm_delseg(VTAILQ_FIRST(&vs->segs));
+ vsm_delseg(VTAILQ_FIRST(&vs->segs), 0);
while (!VTAILQ_EMPTY(&vs->clusters))
- vsm_delseg(VTAILQ_FIRST(&vs->clusters));
+ vsm_delseg(VTAILQ_FIRST(&vs->clusters), 0);
FREE_OBJ(vs);
}
@@ -295,16 +304,8 @@ vsm_wash_set(struct vsm_set *vs, int all)
struct vsm_seg *vg, *vg2;
VTAILQ_FOREACH_SAFE(vg, &vs->segs, list, vg2) {
- if (all || (vg->flags & VSM_FLAG_MARKSCAN) == 0) {
- VTAILQ_REMOVE(&vs->segs, vg, list);
- if (vg->refs) {
- vg->flags |= VSM_FLAG_STALE;
- VTAILQ_INSERT_TAIL(&vs->stale, vg, list);
- } else {
- VAV_Free(vg->av);
- FREE_OBJ(vg);
- }
- }
+ if (all || (vg->flags & VSM_FLAG_MARKSCAN) == 0)
+ vsm_delseg(vg, 1);
}
}
@@ -441,15 +442,14 @@ vsm_cmp_av(char * const *a1, char * const *a2)
}
static struct vsm_seg *
-vsm_findcluster(const struct vsm_seg *vga)
+vsm_findcluster(const struct vsm_set *vs, const char *cnam)
{
- const struct vsm_set *vs = vga->set;
struct vsm_seg *vg;
AN(vs);
- AN(vga->av[1]);
- VTAILQ_FOREACH(vg, &vs->clusters, list) {
+ AN(cnam);
+ VTAILQ_FOREACH(vg, &vs->clusters, clist) {
AN(vg->av[1]);
- if (!strcmp(vga->av[1], vg->av[1]))
+ if (!strcmp(cnam, vg->av[1]))
return (vg);
}
return (NULL);
@@ -498,7 +498,14 @@ vsm_vlu_plus(struct vsm *vd, struct vsm_set *vs, const char *line)
return(-1);
}
- if (vs->vg == NULL) {
+ while (vs->vg != NULL && vsm_cmp_av(&vs->vg->av[1], &av[1]))
+ vs->vg = VTAILQ_NEXT(vs->vg, list);
+ if (vs->vg != NULL) {
+ VAV_Free(av);
+ /* entry compared equal, so it survives */
+ vs->vg->flags |= VSM_FLAG_MARKSCAN;
+ vs->vg = VTAILQ_NEXT(vs->vg, list);
+ } else {
ALLOC_OBJ(vg2, VSM_SEG_MAGIC);
AN(vg2);
vg2->av = av;
@@ -507,19 +514,10 @@ vsm_vlu_plus(struct vsm *vd, struct vsm_set *vs, const char *line)
vg2->serial = ++vd->serial;
if (ac == 4) {
vg2->flags |= VSM_FLAG_CLUSTER;
- VTAILQ_INSERT_TAIL(&vs->clusters, vg2, list);
+ VTAILQ_INSERT_TAIL(&vs->clusters, vg2, clist);
} else {
VTAILQ_INSERT_TAIL(&vs->segs, vg2, list);
- vg2->cluster = vsm_findcluster(vg2);
- }
- } else {
- while (vs->vg != NULL && vsm_cmp_av(&vs->vg->av[1], &av[1]))
- vs->vg = VTAILQ_NEXT(vs->vg, list);
- VAV_Free(av);
- if (vs->vg != NULL) {
- /* entry compared equal, so it survives */
- vs->vg->flags |= VSM_FLAG_MARKSCAN;
- vs->vg = VTAILQ_NEXT(vs->vg, list);
+ vg2->cluster = vsm_findcluster(vs, vg2->av[1]);
}
}
return (0);
@@ -530,7 +528,7 @@ vsm_vlu_minus(struct vsm *vd, struct vsm_set *vs, const char *line)
{
char **av;
int ac;
- struct vsm_seg *vg, *vg2;
+ struct vsm_seg *vg;
av = VAV_Parse(line + 1, &ac, 0);
@@ -542,18 +540,11 @@ vsm_vlu_minus(struct vsm *vd, struct vsm_set *vs, const char *line)
return(-1);
}
- VTAILQ_FOREACH_SAFE(vg, &vs->segs, list, vg2) {
- if (vsm_cmp_av(&vg->av[1], &av[1]))
- continue;
- VTAILQ_REMOVE(&vs->segs, vg, list);
- if (vg->refs) {
- vg->flags |= VSM_FLAG_STALE;
- VTAILQ_INSERT_TAIL(&vs->stale, vg, list);
- } else {
- VAV_Free(vg->av);
- FREE_OBJ(vg);
+ VTAILQ_FOREACH(vg, &vs->segs, list) {
+ if (!vsm_cmp_av(&vg->av[1], &av[1])) {
+ vsm_delseg(vg, 1);
+ break;
}
- break;
}
VAV_Free(av);
return (0);
@@ -925,7 +916,7 @@ VSM_Unmap(struct vsm *vd, struct vsm_fantom *vf)
vsm_unmapseg(vg);
}
if (vg->flags & VSM_FLAG_STALE)
- vsm_delseg(vg);
+ vsm_delseg(vg, 0);
return (0);
}
More information about the varnish-commit
mailing list