[master] d0db0a5 Get rid of the LRU list sentenniel.
Poul-Henning Kamp
phk at varnish-cache.org
Wed Feb 9 11:13:18 CET 2011
commit d0db0a59a90d54417ea00ccb4279d3f65c4c2ba4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Feb 9 10:12:44 2011 +0000
Get rid of the LRU list sentenniel.
diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index da5c80e..08d10ec 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -382,7 +382,7 @@ struct objcore {
#define OC_F_PRIV (1<<5) /* Stevedore private flag */
unsigned timer_idx;
VTAILQ_ENTRY(objcore) list;
- VLIST_ENTRY(objcore) lru_list;
+ VTAILQ_ENTRY(objcore) lru_list;
VTAILQ_ENTRY(objcore) ban_list;
struct ban *ban;
};
@@ -416,15 +416,6 @@ oc_getlru(const struct objcore *oc)
return (oc->methods->getlru(oc));
}
-/*--------------------------------------------------------------------*/
-
-struct lru {
- unsigned magic;
-#define LRU_MAGIC 0x3fec7bb0
- VLIST_HEAD(,objcore) lru_head;
- struct objcore senteniel;
-};
-
/* Object structure --------------------------------------------------*/
VTAILQ_HEAD(storagehead, storage);
@@ -634,7 +625,7 @@ void EXP_Inject(struct objcore *oc, struct lru *lru, double when);
void EXP_Init(void);
void EXP_Rearm(const struct object *o);
void EXP_Touch(struct object *o, double tnow);
-int EXP_NukeOne(const struct sess *sp, const struct lru *lru);
+int EXP_NukeOne(const struct sess *sp, struct lru *lru);
/* cache_fetch.c */
struct storage *FetchStorage(const struct sess *sp, ssize_t sz);
diff --git a/bin/varnishd/cache_expire.c b/bin/varnishd/cache_expire.c
index 23c9cc2..0d3b1a2 100644
--- a/bin/varnishd/cache_expire.c
+++ b/bin/varnishd/cache_expire.c
@@ -98,7 +98,7 @@ exp_insert(struct objcore *oc, struct lru *lru)
assert(oc->timer_idx == BINHEAP_NOIDX);
binheap_insert(exp_heap, oc);
assert(oc->timer_idx != BINHEAP_NOIDX);
- VLIST_INSERT_BEFORE(&lru->senteniel, oc, lru_list);
+ VTAILQ_INSERT_TAIL(&lru->lru_head, oc, lru_list);
oc->flags |= OC_F_ONLRU;
}
@@ -187,8 +187,8 @@ EXP_Touch(struct object *o, double tnow)
return;
if (oc->flags & OC_F_ONLRU) { /* XXX ?? */
- VLIST_REMOVE(oc, lru_list);
- VLIST_INSERT_BEFORE(&lru->senteniel, oc, lru_list);
+ VTAILQ_REMOVE(&lru->lru_head, oc, lru_list);
+ VTAILQ_INSERT_TAIL(&lru->lru_head, oc, lru_list);
VSC_main->n_lru_moved++;
o->last_lru = tnow;
}
@@ -239,6 +239,7 @@ static void * __match_proto__(void *start_routine(void *))
exp_timer(struct sess *sp, void *priv)
{
struct objcore *oc;
+ struct lru *lru;
double t;
(void)priv;
@@ -272,7 +273,8 @@ exp_timer(struct sess *sp, void *priv)
/* And from LRU */
if (oc->flags & OC_F_ONLRU) {
- VLIST_REMOVE(oc, lru_list);
+ lru = oc_getlru(oc);
+ VTAILQ_REMOVE(&lru->lru_head, oc, lru_list);
oc->flags &= ~OC_F_ONLRU;
}
@@ -293,19 +295,14 @@ exp_timer(struct sess *sp, void *priv)
*/
int
-EXP_NukeOne(const struct sess *sp, const struct lru *lru)
+EXP_NukeOne(const struct sess *sp, struct lru *lru)
{
struct objcore *oc;
struct object *o;
/* Find the first currently unused object on the LRU. */
Lck_Lock(&exp_mtx);
- VLIST_FOREACH(oc, &lru->lru_head, lru_list) {
- if (oc == &lru->senteniel) {
- AZ(VLIST_NEXT(oc, lru_list));
- oc = NULL;
- break;
- }
+ VTAILQ_FOREACH(oc, &lru->lru_head, lru_list) {
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
if (oc->timer_idx == BINHEAP_NOIDX) /* exp_timer has it */
continue;
@@ -313,7 +310,7 @@ EXP_NukeOne(const struct sess *sp, const struct lru *lru)
break;
}
if (oc != NULL) {
- VLIST_REMOVE(oc, lru_list);
+ VTAILQ_REMOVE(&lru->lru_head, oc, lru_list);
oc->flags &= ~OC_F_ONLRU;
binheap_delete(exp_heap, oc->timer_idx);
assert(oc->timer_idx == BINHEAP_NOIDX);
diff --git a/bin/varnishd/stevedore.c b/bin/varnishd/stevedore.c
index ae0e634..4865eaf 100644
--- a/bin/varnishd/stevedore.c
+++ b/bin/varnishd/stevedore.c
@@ -70,8 +70,7 @@ LRU_Alloc(void)
ALLOC_OBJ(l, LRU_MAGIC);
AN(l);
- VLIST_INIT(&l->lru_head);
- VLIST_INSERT_HEAD(&l->lru_head, &l->senteniel, lru_list);
+ VTAILQ_INIT(&l->lru_head);
return (l);
}
diff --git a/bin/varnishd/stevedore.h b/bin/varnishd/stevedore.h
index 86da7ee..94a0e06 100644
--- a/bin/varnishd/stevedore.h
+++ b/bin/varnishd/stevedore.h
@@ -50,6 +50,16 @@ typedef void storage_close_f(const struct stevedore *);
#include "vrt_stv_var.h"
#undef VRTSTVTYPE
+/*--------------------------------------------------------------------*/
+
+struct lru {
+ unsigned magic;
+#define LRU_MAGIC 0x3fec7bb0
+ VTAILQ_HEAD(,objcore) lru_head;
+};
+
+/*--------------------------------------------------------------------*/
+
struct stevedore {
unsigned magic;
#define STEVEDORE_MAGIC 0x4baf43db
diff --git a/bin/varnishd/storage_persistent.c b/bin/varnishd/storage_persistent.c
index 1c25e85..fa32472 100644
--- a/bin/varnishd/storage_persistent.c
+++ b/bin/varnishd/storage_persistent.c
@@ -601,10 +601,8 @@ debug_report_silo(struct cli *cli, const struct smp_sc *sc, int objs)
cli_out(cli, " %u nobj, %u alloc, %u lobjlist, %u fixed\n",
sg->nobj, sg->nalloc, sg->p.lobjlist, sg->nfixed);
if (objs) {
- VLIST_FOREACH(oc, &sg->lru->lru_head, lru_list)
- cli_out(cli, " %s %p\n",
- oc == &sg->lru->senteniel ?
- "senteniel" : "OC: ", oc);
+ VTAILQ_FOREACH(oc, &sg->lru->lru_head, lru_list)
+ cli_out(cli, " OC %p\n", oc);
}
}
}
More information about the varnish-commit
mailing list